程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 今天發現使用了很久的SQLite3原來忘記釋放返回錯誤信息的buffer了!汗!

今天發現使用了很久的SQLite3原來忘記釋放返回錯誤信息的buffer了!汗!

編輯:關於SqlServer
今天對程序進程內存洩漏檢查發現:Detected memory leaks!Dumping objects ->{814} normal block at 0x0370AFD0, 40 bytes long. Data: 74 61 62 6C 65 20 54 61 62 6C 65 5F 53 74 72 61 Object dump complete.如果你寫的程序沒有返回錯誤信息,那麼不應該會有洩漏!我的源代碼:if (result == SQLITE_OK) { char *errmsg = NULL; int nError = sqlite3_exec( m_sqlite3DB, "create table Table_StrangeWords( ID integer primary key autoincrement, name nvarchar(32) ,)", NULL, NULL, &errmsg ); if(nError != SQLITE_OK) { //這裡不需要log. ATLTRACE( "創建表失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg ); } //else cont. }跟了一下代碼:if( pStmt ) sqlite3_finalize(pStmt); if( azCols ) sqliteFree(azCols); rc = sqlite3ApIExit(0, rc); if( rc!=SQLITE_OK && rc==sqlite3_errcode(db) && pzErrMsg ){ int nErrMsg = 1 + strlen(sqlite3_errmsg(db)); *pzErrMsg = sqlite3_malloc(nErrMsg); //這裡進行申請buffer,如果不釋放那漏洞大大的。 if( *pzErrMsg ){ memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg); } }else if( pzErrMsg ){ *pzErrMsg = 0; } assert( (rc&db->errMask)==rc );改正後的代碼:if (result == SQLITE_OK) { char *errmsg = NULL; int nError = sqlite3_exec( m_sqlite3DB, "create table Table_StrangeWords( ID integer primary key autoincrement, name nvarchar(32) ,)", NULL, NULL, &errmsg ); if(nError != SQLITE_OK) { //這裡不需要log. ATLTRACE( "創建表失敗,錯誤碼:%d,錯誤原因:%s\n", result, errmsg ); } //else cont. //close if(errmsg != NULL) { sqlite3_free(errmsg); //這裡需要用sqlite3_free去free,切忌! } //else cont. }sqlite把內存管理自己封裝起來,可不能隨便delete這個buffer,遇到問題最好看看它的代碼!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved