Есть ли утечка памяти в обычной процедуре sqlite3 _ * ()? - PullRequest
2 голосов
/ 24 апреля 2010

Обычная процедура 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 

Когда printf () в while (1) {} main () печатает 150, статистика памяти:

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

Похоже, что после 150 циклов памяти память, используемая sqlite3multiwrite, увеличивается с 1104 КБ до 1552 КБ.

Что это значит?утечка памяти или другое?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2010

Используйте Valgrind. Рост с 1,1 МБ до 1,5 МБ невелик, особенно за 150 итераций. Например, SQLite может выполнять некоторое кэширование (заранее резервирует память).

Попробуйте больше итераций - возможно, существует пороговое значение, выше которого ваша программа не может расти. Но Valgrind - самый точный инструмент для обнаружения утечек памяти.

1 голос
/ 26 апреля 2010

Я получил ключевой ответ от http://old.nabble.com/Is-there-any-memory-leak-in-the-normal-routine--td28348648.html#a28354683

Причина кеша в sqlite3:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...