2020年5月16日土曜日

C++メモリリークの対処方法の検討

3案あります。

1)unique_ptr,shared_ptr を使う
2)終了時にまとめてobjectをdeleteする。その際、unordered_set<void*> に記憶させてdouble deleteを防止する。
3)独自のアロケータを使う

1)でunique_ptrで書けるところは、書き直してみました。しかし、shared_ptrを使うとなるとruntime 性能の劣化が気になります。基本的には、C#や、JAVAがやっている参照カウント方式です。書き直しにも膨大な手間が必要でバグなしに書き直すのは至難です。

2)案では、runtime性能の劣化は軽微でしょう。Desktop版では、deleteしなければ、peformanceの劣化は、原理上ありません。しかし、サーバ版では、やはりこまめに、leak箇所を潰していく作業が必要となります。1)案よりは良さそうですが、作業量は未だ多そうです。

3)tcmalloc,jemalloc,nedmalloc,miallocを使う
これらは、小メモリに対しては、threadに対するヒープを備えているはずです。new/delete をオーバライドして、thread 消滅時にそのヒープを開放してやれば、one go で行けるはずです。要件としては、それらのhackが可能であることとLinux/Windows の両方にポート可能であること、さらには、statisticsも出力可能であること、そんなライブラリがあればよいのです。

考えてみれば、サーバアプリケーションでは、メモリの回収機構は、備えていなければなりません。今の時代、C/C++で、サーバアプリというのは、考えられないことかもしれませんが、究極の性能を提供する計算サーバという視点でみるならば、現時点のみならず今後も必要なような気がします。
その意味で、C++の進化は、必要なことであると理解できます。






0 件のコメント:

コメントを投稿