我執行測試後的結論是這樣的:確實發生了記憶體洩漏。沒有**sqlca區域。
因為,我修改了 /src/inte***ces/ecpg/ecpglib/misc.c的**後,
#ifdef enable_thread_safetystatic
void
ecpg_sqlca_key_destructor(
void *arg)
static
void
ecpg_sqlca_key_init(
void
)#endif
struct sqlca_t *ecpgget_sqlca(
void
)
return
(sqlca);
#else
file *p5;
p5=fopen("
gaoecpg.5
","w+");
fclose(p5);
return (&sqlca);
#endif
}
無論連線是成功還是失敗,都生成三個檔案:
gaoecpg.3,gaoecpg.4, gaoecpg.6
下面是我的測試程式 :
#include #include#include
int cm_connectdb(const
char *dbuid,const
char *dbpswd,const
char *hostname,char *pcsqlerrm)
strcpy((
char *)suserid.arr, dbuid);
suserid.len = (unsigned short)strlen((char *)suserid.arr);
strcpy((
char *)spasswd.arr, dbpswd);
spasswd.len = (unsigned short)strlen((char *)spasswd.arr);
strcpy((
char *)shostname.arr, hostname);
shostname.len = (unsigned short)strlen((char *)shostname.arr);
exec sql connect to :shostname as cm_dbconn user:suserid identified by :spasswd;
if (sqlca.sqlcode!=0
)else
exec sql disconnect cm_dbconn;
return0;
}int
main()
雖然,按照網上的說法,理論上:執行緒結束的時候,就會自動呼叫pthread_key_create註冊的函式
但是至少我遇到的情況,並非如此。
valgrind 報告 ecpg記憶體洩露 二
真是原因到底是什麼呢?由於 exec sql connect 而導致 valgrind 報告 記憶體洩露錯誤。那麼在同乙個程式裡面,加入 exec sql disconnect 後,會如何呢?驗證的結果是,依然如此,還是會說 still reachable 220 bytes in 1 blocks...
valgrind 報告 ecpg記憶體洩露 二
真是原因到底是什麼呢?由於 exec sql connect 而導致 valgrind 報告 記憶體洩露錯誤。那麼在同乙個程式裡面,加入 exec sql disconnect 後,會如何呢?驗證的結果是,依然如此,還是會說 still reachable 220 bytes in 1 blocks...
valgrind 報告 ecpg記憶體洩露 三
valgrind為何 報 ecpg記憶體洩露錯誤?根據我的同事的研究成果 究其原因,全域性變數 sqlca 由malloc形成,但是釋放時是隱含的 ecpg sqlca key destructor函式呼叫 free 進行釋放。複製 bool ecpgconnect int lineno,int c...