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

问题描述 投票:0回答:1

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
,内存管理准则是:

如果

sqlite3_exec()
的第5个参数不是
NULL
,则任何错误消息都会写入从
sqlite3_malloc()
获得的内存中,并通过第5个参数传回。 为了避免内存泄漏,应用程序应调用
sqlite3_free()

但是,没有提及必须为

callback()
做什么!它有第三个和第四个参数作为
char**
传递。
问题:谁必须对其进行内存管理?是否应该以与上述相同的方式释放它?

目的

我在一个应用程序中使用 SQLite,该应用程序涉及使用各种

SELECT
获取大量数据。运行几天后,RAM 使用量逐渐从 50 MB 增加到 150 MB,然后增加到 250 MB。使用“Deleaker”工具,大多数主要内存分配都显示在“sqlite3.c”文件中。

c++ c sqlite memory-management callback
1个回答
2
投票

您只需阅读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);
© www.soinside.com 2019 - 2024. All rights reserved.