【C++入門】今のうちからメモリリークに注意する

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.

5年前

コメントを残す

メールアドレスが公開されることはありません。