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。
这是什么意思?内存泄漏还是其他的事情?
答案 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的缓存是原因,:)