JAVAで普通にやってしまうようなことも、C++だとメモリリークにつながる。
たとえば、下記の例。
ポインタへの代入など、JAVAだと代入前に参照していたオブジェクトは、GCが勝手に解放してくれるんだけれども、C++ではそうはいかない。
【メモリリークを起こす例】
HogeClass* hoge = new HogeClass(”最初のインスタンス”); //最初のインスタンスの参照が失われるのでメモリリークを起こす。 hoge = new HogeClass(”2番目のインスタンス”); //2番目のインスタンスのデストラクタが呼ばれる。 delete hoge; //メモリリークが検出される。 _CrtDumpMemoryLeaks();
【メモリリークを起こさない例】
HogeClass* hoge = new HogeClass(”最初のインスタンス”); //最初のインスタンスのデストラクタが呼ばれる。 delete hoge; //最初のインスタンスの参照が失われてもメモリリークにならない。 hoge = new HogeClass(”2番目のインスタンス”); //2番目のインスタンスのデストラクタが呼ばれる。 delete hoge; //メモリリークは検出されない。 _CrtDumpMemoryLeaks();
_CrtDumpMemoryLeaks()
ちなみに、このメソッドはメモリリークを検出してくれる。
使い方は簡単で、下記のとおりインクルードを行う。
#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h>
そして、メモリは全部解放済みだと思う時点で呼び出す。
デバッグモードであれば、メモリリークがあった場合、コンソールに下記のようなログで知らせてくれる。
Detected memory leaks!
Dumping objects ->
{185} normal block at 0x003CB930, 19 bytes long.
Data: < C X ^ > 8D C5 8F 89 82 CC 83 43 83 93 83 58 83 5E 83 93
{149} normal block at 0x003CAF78, 8 bytes long.
Data: < 0 < > 00 00 00 00 30 B9 3C 00
Object dump complete.
Related Posts
カテゴリー: C++