この1つの主題に関する私の確かに独断的な意見では、少なくとも広く適用されることを目的とする図書館では、物理的な漏れの言い訳はありません。したがって、GTK +開発者が自分で修正するまでバグを出したいと思います。
ライブラリがatexit
コールバックを登録して、少なくともアンロードされたときに割り当てたメモリを解放するのは簡単です。ボートでの小さな割り当ての費用を避けたい場合、そもそもそれらを行うべきではありません。
わずかなメモリチャンクのボートロードを一度に割り当てたいだけの遅延プログラムでも、シャットダウン時にすべてのメモリを削除する単純な順次アロケータを使用できます。アロケーターがアライメントを処理したくない場合は、プールするすべてのチャンクを最大アライメント境界までパディングできます。これらの小さなメモリチャンクをすべて個別に解放しないことで、シャットダウン時間を短縮できるというメリットがある場合、同様に、メモリをストレートシーケンシャル形式でプールするシーケンシャルアロケータを使用することで、ささいな労力と引き換えに対称的に大きなメリットを得ることができますよりもはるかに高速な割り当てmalloc
よりキャッシュに優しいメモリパターン。ライブラリの完了時に、アロケータによってプールされた連続メモリのすべての大きなブロックのみが解放されます。ライブラリがしなけれmalloc
ばならないのは、気にする必要のない呼び出しをのfree
ようなものに置き換え、コールバックをseq_malloc
呼び出しseq_purge
て、atexit
アンロード時に割り当てられたすべてのメモリを解放することです。
そうしないと、メモリリーク検出ツールでこの厄介なライブラリがメッセージを散らかしてしまい、フィルターで除外する必要があります。さらに悪いことに、それらを体系的に除外しないと、彼らはあなた自身のアプリケーションの漏れを覆い隠し、あなたの同僚はそれらを見落とす習慣を発達させ、そもそもあなた自身のチームを防ぐ上で漏れ検出ツールの有用性を減らすかもしれません漏れやすいコードをプッシュします。それはひどくandく、何よりも、上記のソリューションを使用することがいかに簡単かを考えると、これを意図的に行うことを支持する議論がまったく説得力がないと思います。
論理リーク(ガベージコレクションでさえ保護できないより複雑な種類)はより複雑な問題であり、割り当てられたすべてのメモリをパージする限り、短命のプログラムが論理リークを持つことの正当化を見つけることができます論理的なリークを回避するためにリソース管理について多くのことを考える必要があるため、シャットダウンします(GCを備えた言語ではおそらくそうです)。しかし、最も怠physicalな状況でも物理的リークを回避することがいかに些細なことかを考えると、物理的リークを回避するための合理的な言い訳は見つかりません。
とにかく、少なくとも私はvalgrindのリークを除外して、少なくとも自分のチームを見つけられるようにする能力を台無しにしないようにします。