如何管理传递给 sqlite3_exec() 的 “callback” 参数的参数的内存?

How is the memory managed for arguments passed to sqlite3_exec()'s "callback" parameter?

提问人:iammilind 提问时间:2/9/2023 最后编辑:TylerHiammilind 更新时间:8/19/2023 访问量:105

问:

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()NULLsqlite3_malloc()sqlite3_free()

但是,没有提到必须为!它有第 3 个和第 4 个参数作为 传递。
问题:谁必须对它进行内存管理,是否应该以与上述相同的方式释放它?
callback()char**

目的

我正在一个应用程序中使用 SQLite,该应用程序涉及使用各种 s 获取大量数据。运行几天后,RAM 使用量从 50 MB 逐渐增加到 150 MB,然后增加到 250 MB。使用“Deleaker”工具,大多数主要的内存分配都显示在“sqlite3.c”文件中。SELECT

C++ C SQLite 内存管理 回调

评论

0赞 TylerH 8/19/2023
ChatGPT 内容在 Stack Overflow 上被禁止。

答:

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 来获取游标。假设该函数不会泄漏内存。