valgrind 報告 ecpg記憶體洩露 四

2021-09-06 05:50:15 字數 1472 閱讀 7797

我執行測試後的結論是這樣的:確實發生了記憶體洩漏。沒有**sqlca區域。

因為,我修改了 /src/inte***ces/ecpg/ecpglib/misc.c的**後,

#ifdef enable_thread_safety

static

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...