在sqlite3 _ *()的正常例程中是否有任何内存泄漏?

时间:2010-04-24 08:20:28

标签: c sqlite

sqlite3_prepare_v2()+ sqlite3_step()+ sqlite3_finalize()的正常例程可能包含泄漏。

听起来很荒谬。但测试代码似乎在说。或者我错误地使用了sqlite3 _ *()。

感谢任何回复。

#include <stdio.h> 
#include <unistd.h>     // for usleep() 
#include <sqlite3.h> 


int multi_write (int j); 

sqlite3 *db = NULL; 

int main (void) 
{ 
    int ret = -1; 

    ret = sqlite3_open("test.db", &db); 
    ret = sqlite3_exec(db,"CREATE TABLE data_his (id INTEGER PRIMARY KEY, d1 CHAR(16))", NULL,NULL,NULL); 
    usleep (100000); 


    int j=0; 
    while (1) 
    { 
        multi_write (j++); 
        usleep (2000000); 
        printf ("   ----------- %d\n", j); 
    } 


    ret = sqlite3_close (db); 
    return 0; 
} 


int multi_write (int j) 
{ 
    int ret = -1; 

    char *sql_f = "INSERT OR REPLACE INTO data_his VALUES (%d, %Q)"; 
    char *sql = NULL; 

    sqlite3_stmt *p_stmt = NULL; 


    ret = sqlite3_prepare_v2 (db, "BEGIN TRANSACTION", -1, &p_stmt, NULL); 
    ret = sqlite3_step ( p_stmt ); 
    ret = sqlite3_finalize ( p_stmt ); 

    int i=0; 
    for (i=0; i<100; i++) 
    { 
        sql = sqlite3_mprintf ( sql_f, j*100000 + i, "00000000000068FD"); 

        ret = sqlite3_prepare_v2 (db, sql, -1, &p_stmt, NULL ); 
        sqlite3_free ( sql ); 
        //printf ("sqlite3_prepare_v2(): %d, %s\n", ret, sqlite3_errmsg (db)); 

        ret = sqlite3_step ( p_stmt ); 
        //printf ("sqlite3_step():       %d, %s\n", ret, sqlite3_errmsg (db)); 

        ret = sqlite3_finalize ( p_stmt ); 
        //printf ("sqlite3_finalize():   %d, %s\n\n", ret, sqlite3_errmsg (db)); 
    } 

    ret = sqlite3_prepare_v2 (db, "COMMIT TRANSACTION", -1, &p_stmt, NULL ); 
    ret = sqlite3_step ( p_stmt ); 
    ret = sqlite3_finalize ( p_stmt ); 


    return 0; 
}

我看这个过程是由顶级运行的。

首先,内存统计信息是:

PID     PPID   USER     STAT   VSZ    %MEM  %CPU  COMMAND 
17731   15488  root     S      1104   5%    7%    ./sqlite3multiwrite 

当main()的while(1){}中的printf()打印150时,内存统计信息为:

PID     PPID   USER     STAT   VSZ    %MEM  %CPU  COMMAND 
17731   15488  root     S      1552   5%    7%    ./sqlite3multiwrite 

听起来,在150个for-cycles之后,sqlite3multiwrite使用的内存从1104KB增加到1552KB。

这是什么意思?内存泄漏还是其他的事情?

2 个答案:

答案 0 :(得分:2)

使用Valgrind。 1.1 MB到1.5 MB的增长并不是那么大,尤其是超过150次迭代。例如,SQLite可以进行一些缓存(它预先保留一些内存)。

尝试更多信息 - 可能存在程序无法增长的阈值。但Valgrind是查找内存泄漏的最准确工具。

答案 1 :(得分:1)

我从http://old.nabble.com/Is-there-any-memory-leak-in-the-normal-routine--td28348648.html#a28354683

得到了关键答案

sqlite3的缓存是原因,:)