Hi there, I am a huge fan of SQLite and have recently done some code that I am debugging with TotalView and MemoryScape (http://www.roguewave.com) - VERY VERY nice debugger, I have used GDB as well alot but Totalview is simply awesome....
NOTE: C coding is NOT my day job ;-) So please bear with me.... I am using MemoryScape (I suppose the same as Valgrind) to detect Memory leaks in my code.....when I look at the leak detection I can see I have some small leaks in my SQLIte code....and would love someone to tell me how I can fix them? For example MemoryScape complians about the following 2 lines below: - idx = sqlite3_bind_parameter_index( stmt, ":tid" ); - rc = sqlite3_step(stmt); Here is more of the code context.... int queue_peekByTID(const char *tid, message *msg){ char *peekText = "SELECT * FROM queue WHERE tid = :tid;"; const char *value = NULL; int idx; int len; sqlite3_prepare_v2(handle,peekText,-1,&stmt,0 ); idx = sqlite3_bind_parameter_index( stmt, ":tid" ); sqlite3_bind_text( stmt, idx, tid, -1, SQLITE_STATIC ); rc = sqlite3_step(stmt); if(rc == SQLITE_ROW){ .... .... } What is wrong with my code above? Must I FREE the char*? Why would something say it was a "leak"? I am also getting it complaining when I do a "sqlite3_finalize(stmt);" I another piece of code I am using SQLite to log certain events for me....and complains about the following 3 lines below: - rc = sqlite3_open_v2(eventLogName,&handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE | SQLITE_OPEN_CREATE, NULL); - rc = sqlite3_exec(handle,journalMode,0,0,0); - rc = sqlite3_exec(handle,trigger,0,0,0); Here is the code context.... int eventLogOpen(char *eventLogName, unsigned int eventLogRetentionPeriod){ char *eventLogTable = "CREATE TABLE IF NOT EXISTS [log] ( " "[idx] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " "[timestamp] CHAR(25), " "[timestamp_secs] CHAR(10), " "[event_cat] CHAR(10), " "[event_tid] CHAR(50), " "[event_bus_ref] CHAR(50), " "[event_msg] TEXT);"; char trigger[2024]; if(eventLogRetentionPeriod > 0){ sprintf(trigger, "DROP TRIGGER IF EXISTS [log_retention]; " "CREATE TRIGGER [log_retention] " "AFTER INSERT ON log " "FOR EACH ROW BEGIN " "DELETE FROM log " "WHERE timestamp_secs < (strftime('%%s', 'now') - %i); " "END;", eventLogRetentionPeriod); } char *journalMode = "PRAGMA journal_mode=wal;"; int successFlag = ERROR; rc = sqlite3_open_v2(eventLogName,&handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE | SQLITE_OPEN_CREATE, NULL); if (rc == OK){ successFlag = OK; p = sqlite3_malloc(256); sqlite3_busy_handler(handle, &eventLoggerBusyHandler, p); sqlite3_free(p); sqlite3_exec(handle,"PRAGMA default_cache_size = 50;",0,0,0); rc = sqlite3_exec(handle,journalMode,0,0,0); if(rc == OK){ rc = sqlite3_exec(handle,eventLogTable,0,0,0); if(rc == OK){ rc = sqlite3_exec(handle,trigger,0,0,0); } } } return successFlag; } Is there anything I can do to prevent these "leaks"? Maybe I need to clean up using some other SQLite functions I am not aware of etc? Thanks for the help ;-) Lynton ---------------------------------------------------------------------------- NOTICE: Please note that this eMail, and the contents thereof, is subject to the standard Sasol eMail legal notice which may be found at: http://www.sasol.com/legalnotices If you cannot access the legal notice through the URL attached and you wish to receive a copy thereof please send an eMail to legalnot...@sasol.com ---------------------------------------------------------------------------- _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users