SQLite 的一步查询执行接口 看起来像:
int sqlite3_exec(sqlite3 *db, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**),/* Callback function */
void *p1, /* 1st argument to callback */
char **errmsg); /* Error msg written here */
对于最后一个参数
errmsg
,内存管理准则是:
如果
的第5个参数不是sqlite3_exec()
,则任何错误消息都会写入从NULL
获得的内存中,并通过第5个参数传回。 为了避免内存泄漏,应用程序应调用sqlite3_malloc()
sqlite3_free()
但是,没有提及必须为
callback()
做什么!它有第三个和第四个参数作为 char**
传递。目的:
我在一个应用程序中使用 SQLite,该应用程序涉及使用各种
SELECT
获取大量数据。运行几天后,RAM 使用量逐渐从 50 MB 增加到 150 MB,然后增加到 250 MB。使用“Deleaker”工具,大多数主要内存分配都显示在“sqlite3.c”文件中。
您只需阅读sqlite3_exec的源代码即可。
对于循环的每次迭代,都会检索值:
if( rc==SQLITE_ROW ){
azVals = &azCols[nCol];
for(i=0; i<nCol; i++){
azVals[i] = (char *)sqlite3_column_text(pStmt, i);
if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
sqlite3OomFault(db);
goto exec_out;
}
}
azVals[i] = 0;
}
回调后,它们被释放:
sqlite3DbFree(db, azCols);