2011-12-18 52 views
3

最近,我開始研究一個使用libmysqlclient的C程序。當用valgrind檢查我的代碼時,它報告了內存泄漏。以下最低的代碼片段重現行爲:MySQL C API內存泄漏?

#include <mysql.h> 

int main(void) 
{ 
    MYSQL* mysql = mysql_init(0); 

    mysql_close(mysql); 

    return 0; 
} 

檢查與valgrind生成的程序告訴我:

==25614== LEAK SUMMARY: 
==25614== definitely lost: 0 bytes in 0 blocks 
==25614== indirectly lost: 0 bytes in 0 blocks 
==25614==  possibly lost: 0 bytes in 0 blocks 
==25614== still reachable: 288 bytes in 3 blocks 
==25614==   suppressed: 0 bytes in 0 blocks 

根據MySQL的API參考,mysql_close() ...

關閉次數一個以前打開的連接。如果句柄由mysql_init()或mysql_connect()自動分配,mysql_close()也會釋放由mysql指向的連接句柄。

但是,valgrind報告未釋放的內存。這裏有什麼問題?

+0

可能是初始化一次的內部緩衝區? – 2011-12-18 20:33:28

+0

我認爲這與valgrind使用本地時間和朋友檢測泄漏有關 – Ulterior 2011-12-18 20:35:37

+0

Michael:你說得對,看我的答案。 – Philip 2011-12-18 20:38:27

回答

6

挖掘文檔,我發現功能mysql_library_end()解決了這個問題。

從MySQL API參考舉例:

該功能最終確定MySQL庫。您應該在完成使用庫時調用它(例如,從服務器斷開連接後)。

在個人記錄中,我覺得迫使其用戶調用自己的清理功能相當煩人。國際海事組織,更好的解決辦法是自動撥打mysql_library_end(),只要連接數量降至零。

+4

6分鐘可以有區別 – Ulterior 2011-12-18 20:41:59

+0

Ulterior:措辭問題花了我更長的時間: – Philip 2011-12-18 22:31:02

+0

今天我注意到了這一點,發現它有點愚蠢,必須手動調用library_end o.O – 2012-01-19 09:45:53