Below is my code. My question is: Is there any memory leak in the pthread2?
While pthread1 is using test.db exclusively, the sqlite3_prepare_v2() of pthread2 still prepares the p_stmt pointer to a piece of memory malloced by sqlite3_preapare_v2(). And then the sqlite3_finalize() can't free the memory still because pthread1 is using test.db exclusively. Does it cause a memory leak? ______code__________________________________________________________ #include <stdio.h> #include <unistd.h> // for usleep() #include <sys/time.h> // for gettimeofday() #include <pthread.h> #include <sqlite3.h> void pthread1 (void); void pthread2 (void); int main (void) { int ret = -1; sqlite3 *g_db = NULL; ret = sqlite3_open ("test.db", &g_db); ret = sqlite3_exec (g_db, "CREATE TABLE t1 (id INTEGER PRIMARY KEY, d1 TEXT)", NULL,NULL,NULL); ret = sqlite3_close (g_db); usleep (500000); pthread_t pthr1, pthr2; ret = pthread_create (&pthr1, NULL, (void *) pthread1, NULL); ret = pthread_create (&pthr2, NULL, (void *) pthread2, NULL); ret = pthread_join (pthr1, NULL); printf ("thread1 end\n"); ret = pthread_join (pthr2, NULL); printf ("thread2 end\n"); return 0; } void pthread1 (void) { int ret = -1; sqlite3 *db1 = NULL; ret = sqlite3_open ("test.db", &db1); char *sql_f = "INSERT OR REPLACE INTO t1 VALUES (%d, 'aaabbbcccddd1122')"; char *sql = NULL; sqlite3_stmt *p_stmt = NULL; struct timeval tv1, tv2; ret = gettimeofday (&tv1, NULL); ret = sqlite3_prepare_v2 (db1, "BEGIN TRANSACTION", -1, &p_stmt, NULL); ret = sqlite3_step (p_stmt); ret = sqlite3_finalize (p_stmt); // n=1000000, test.db is 25843712 bytes, 25M; int i=0, n=1000000; for (i=0; i<n; i++) { sql = sqlite3_mprintf (sql_f, i); ret = sqlite3_prepare_v2 (db1, sql, -1, &p_stmt, NULL); ret = sqlite3_step (p_stmt); ret = sqlite3_finalize (p_stmt); } printf ("pthread1: ret: %d\n", ret); ret = sqlite3_prepare_v2 (db1, "COMMIT TRANSACTION", -1, &p_stmt, NULL); ret = sqlite3_step (p_stmt); ret = sqlite3_finalize (p_stmt); ret = gettimeofday (&tv2, NULL); printf ("time is : %ds\n", (int) (tv2.tv_sec - tv1.tv_sec)); ret = sqlite3_close (db1); } void pthread2 (void) { int ret = -1; sqlite3 *db2 = NULL; ret = sqlite3_open ("test.db", &db2); usleep (2000000); sqlite3_stmt *p_stmt = NULL; int i=0, n=10; for (i=0; i<n; i++) { char *sql_f = "INSERT OR REPLACE INTO t1 VALUES (%d, 'bbbbbbbbbbbb1122')"; char *sql = NULL; sql = sqlite3_mprintf (sql_f, i); ret = sqlite3_prepare_v2 (db2, sql, -1, &p_stmt, NULL); printf ("pthread2: prepare: %d, p_stmt: %p, errmsg: %s\n", ret, p_stmt, sqlite3_errmsg(db2)); ret = sqlite3_step (p_stmt); printf ("pthread2: step: %d, p_stmt: %p, errmsg: %s\n", ret, p_stmt, sqlite3_errmsg(db2)); ret = sqlite3_finalize (p_stmt); printf ("pthread2: finalize: %d, p_stmt: %p, errmsg: %s\n", ret, p_stmt, sqlite3_errmsg(db2)); printf ("\n"); usleep (300000); } ret = sqlite3_close (db2); printf ("pthread2: close: %d, p_stmt: %p, errmsg: %s\n", ret, p_stmt, sqlite3_errmsg(db2)); } -- View this message in context: http://old.nabble.com/Is-there-any-memory-leak-in-the-code--tp28337631p28337631.html Sent from the SQLite mailing list archive at Nabble.com. _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users