Hey guys.
I'm sure that this is to do with the way I am using SQLite. I do not
have time to radically change my methodology at this point, but I do
need to fix a rather severe memory leak I'm having.
(My apologies for the code)
Any help is much appreciated.
I query like this:
int SQLiteObject::ExecuteSQL(const char* sql, int hack)
{
int iResult;
sqlite_resultset* pResultSet;
// create a new resultset
pResultSet = new sqlite_resultset;
if (pResultSet)
{
pResultSet->bValid = false;
pResultSet->iCurrentColumn = 0;
pResultSet->iCurrentRow = 0;
pResultSet->iNumCols = 0;
pResultSet->iNumRows = 0;
pResultSet->iResultSet = m_iNextResultSet;
pResultSet->vRows.clear();
m_iLastResultSet = m_iNextResultSet;
m_iNextResultSet++;
}
else
return 0;
iResult = sqlite3_exec(m_pDatabase, sql, Callback,
(void*)pResultSet, &m_szErrorString);
if (iResult == 0)
{
//SQLITE_OK
SaveResultSet(pResultSet);
//Con::executef(this, 1, "onQueryFinished()");
return pResultSet->iResultSet;
}
else
{
// error occured
Con::executef(this, 2, "onQueryFailed", m_szErrorString);
delete pResultSet;
return 0;
}
return 0;
}
And I "clear a result" like this:
void SQLiteObject::ClearResultSet(int index)
{
sqlite_resultset* resultSet;
sqlite_resultrow* resultRow;
S32 rows, cols, iResultSet;
// Get the result set specified by index
resultSet = GetResultSet(index);
iResultSet = GetResultSetIndex(index);
if ((!resultSet) || (!resultSet->bValid))
{
Con::warnf("Warning SQLiteObject::ClearResultSet(%i) failed to
retrieve specified result set. Result set was NOT cleared.", index);
return;
}
// Now we have the specific result set to be cleared.
// What we need to do now is iterate through each "Column" in each "Row"
// and free the strings, then delete the entries.
VectorPtr<sqlite_resultrow*>::iterator iRow;
VectorPtr<char*>::iterator iColumnName;
VectorPtr<char*>::iterator iColumnValue;
for (iRow = resultSet->vRows.begin(); iRow !=
resultSet->vRows.end(); iRow++)
{
// Iterate through rows
// for each row iterate through all the column values and names
for (iColumnName = (*iRow)->vColumnNames.begin(); iColumnName !=
(*iRow)->vColumnNames.end(); iColumnName++)
{
// Iterate through column names. Free the memory.
delete[] (*iColumnName);
}
for (iColumnValue = (*iRow)->vColumnValues.begin(); iColumnValue
!= (*iRow)->vColumnValues.end(); iColumnValue++)
{
// Iterate through column values. Free the memory.
delete[] (*iColumnValue);
}
// free memory used by the row
delete (*iRow);
}
// empty the resultset
resultSet->vRows.clear();
resultSet->bValid = false;
delete resultSet;
m_vResultSets.erase_fast(iResultSet);
}
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users