2011-12-18 20 views
3

最近、私はlibmysqlclientを利用したCプログラムに取り組み始めました。 valgrindでコードをチェックすると、メモリリークが報告されました。 ...MySQL C APIのメモリリーク?

==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()による

が閉じる:私に語っ

#include <mysql.h> 

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

    mysql_close(mysql); 

    return 0; 
} 

valgrindを有する得られたプログラムを確認する次の最小限のコードスニペットは動作を再現します以前に開いた接続。 mysql_close()は、ハンドルがmysql_init()またはmysql_connect()によって自動的に割り当てられた場合、mysqlが指す接続ハンドルの割り当てを解除します。

ただし、valgrindは解放されていないメモリを報告します。ここで何が間違っていますか?

+0

おそらく一度初期化される内部バッファ? –

+0

これは、ローカルタイムとフレンドを使用したバググライ​​ンドのリークを検出することに関連していると思います – Ulterior

+0

マイケル:そうです、私の答えを見てください。 – Philip

答えて

6

ドキュメントを掘り下げて、問題を解決する関数mysql_library_end()が見つかりました。

MySQLのAPIリファレンスからの引用:

この関数は、MySQLライブラリを確定。ライブラリの使用が終了したら(たとえば、サーバーから切断した後に)呼び出す必要があります。

個人的には、libmysqlclientは、ユーザーが独自のクリーンアップ機能を呼び出さなければならないと迷惑をかけることがあります。 IMOでは、接続数がゼロになるたびにmysql_library_end()を自動的に呼び出す方が良いでしょう。

+4

6分は違いを生むことができる – Ulterior

+0

Ulterior: – Philip

+0

私は今日同じことに気づき、少し愚かであることがわかりました。手動でlibrary_end o.Oを呼び出さなければなりません –