提问人:iammilind 提问时间:2/9/2023 最后编辑:TylerHiammilind 更新时间:8/19/2023 访问量:105
如何管理传递给 sqlite3_exec() 的 “callback” 参数的参数的内存?
How is the memory managed for arguments passed to sqlite3_exec()'s "callback" parameter?
问:
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 个参数 to 不是,则任何错误消息都会写入从第 5 个参数获取并通过 5 个参数传回的内存中。为避免内存泄漏,应用程序应调用
sqlite3_exec()
NULL
sqlite3_malloc()
sqlite3_free()
但是,没有提到必须为!它有第 3 个和第 4 个参数作为 传递。
问题:谁必须对它进行内存管理,是否应该以与上述相同的方式释放它?callback()
char**
目的:
我正在一个应用程序中使用 SQLite,该应用程序涉及使用各种 s 获取大量数据。运行几天后,RAM 使用量从 50 MB 逐渐增加到 150 MB,然后增加到 250 MB。使用“Deleaker”工具,大多数主要的内存分配都显示在“sqlite3.c”文件中。SELECT
答:
2赞
Botje
2/9/2023
#1
您只需阅读源代码即可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);
评论
0赞
iammilind
2/9/2023
谢谢你的回答。您认为“sqlite3.c”中是否有任何可疑区域,除了这些之外,还可能导致内存泄漏?请注意,我没有在任何地方使用,只是直接使用。sqlite3_prepare()
sqlite3_execute()
0赞
Botje
2/9/2023
exec 函数在内部使用 prepare 来获取游标。假设该函数不会泄漏内存。
上一个:尝试在连接蓝牙时收到警报
下一个:TLS 回调链接器设置
评论