メモリリーク

プログラマとして避けて通れないのがメモリリーク。しっかりと確保・解放を行っていればそれほど驚異ではないのですが、やっぱり人間です。開放し忘れちゃうことが多々あります。

ここでメモリリークを検出するオリジナルのソースコードをばーんと貼りたいところですが、うまく機能しなかったので、Windows限定ですがリークを検出する方法を紹介したいと思います。

方法は簡単です。

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define new ::new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif // _DEBUG


int main( int argc, char *argv[] )
{
  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

  char *buffer = nullptr;
  buffer = new char[100];


  _CrtDumpMemoryLeaks();
  return EXIT_SUCCESS;
}

こんな感じで_CRTDBG_MAP_ALLOCをdefineして、デバッグ用のヘッダをインクルード、::newの置き換え。プログラム終了時にリーク出力関数を呼んで終わりです。上記のコードですと、new char[100]と確保しているのに、開放していませんので、

とこんな感じで、VisualStudioの出力ウィンドウにリーク情報が出力されます。ファイル名と行番号まで表示してくれるので非常に追いやすいですね。

この場合、delete[] buffer;してあげるとリークはなくなります。リークは放っておくとどんどん増えちゃって収集つかなくなりますので、メモリを確保したら開放するよう習慣づけておきましょうと自分に言い聞かせています。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次の記事

消費税