MySQL C APIのメモリリーク?

最近、私は libmysqlclient を利用するCプログラムを開発し始めました。 valgrind でコードをチェックすると、メモリリークが報告されました。次の最小限のコードスニペットが動作を再現します。

#include 

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 Referenceによると、 mysql_close() ...

以前に開いた接続を閉じます。 mysql_close()は、ハンドルがmysql_init()またはmysql_connect()によって自動的に割り当てられた場合、mysqlが指す接続ハンドルを解放します。

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

3
私はこれがローカルタイムやフレンドを使ったリークを検出するvalgrindに関係していると思います
追加された 著者 Ulterior,
おそらく一度初期化される内部バッファ?
追加された 著者 Michael Krelin - hacker,
マイケル:あなたは正しい、私の答えを参照してください。
追加された 著者 Philip,

1 答え

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

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

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

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

6
追加された
6分は違いを生むことができる
追加された 著者 Ulterior,
私は今日同じことに気づいて、少しばかげて、手作業でlibrary_end o.Oを呼び出さなければならないことがわかりました
追加された 著者 Bas Jansen,
Ulterior:質問が私を長く取った
追加された 著者 Philip,