1

現在ヒープに割り当てられているメモリのブロック数を取得できる関数はありますか? Windows/Visual Studio 固有の場合があります。

専用のプロファイラーを使用せずに、関数がメモリリークを起こしているかどうかを確認するためにそれを使用したいと思います。私は次のようなことを考えています:

int before = AllocatedBlocksCount();
foo();
if (AllocatedBlocksCount() > before)
    printf("Memory leak!!!");
4

1 に答える 1

2

これを行うにはいくつかの方法があります (Microsoft Visual Studio に付属の CRT に固有です)。

1 つの方法は_CrtMemCheckpoint()、関心のある呼び出しの前後で関数を使用し、その違いを と比較すること_CrtMemDifference()です。

_CrtMemState s1, s2, s3;

_CrtMemCheckpoint (&s1);
foo(); // Memory allocations take place here
_CrtMemCheckpoint (&s2);

if (_CrtMemDifference(&s3, &s1, &s2)) // Returns true if there's a difference
   _CrtMemDumpStatistics (&s3);

を使用して、割り当てられたすべてのブロックを列挙することもできます。また_CrtDoForAllClientObjects()、Visual C++ CRT のデバッグ ルーチンを使用して他のいくつかの方法を使用することもできます。

ノート:

  • これらはすべて<crtdbg.h>ヘッダーにあります。
  • これらは明らかに Windows でのみ動作し、VC でコンパイルする場合にのみ機能します。
  • CRT デバッグといくつかのフラグなどを設定する必要があります。
  • これらはややトリッキーな機能です。MSDN の関連部分を注意深く読んでください。
  • これらはデバッグ モードでのみ機能します (つまり、デバッグ CRT と_DEBUG定義されたマクロとのリンク)。
于 2013-03-27T15:32:08.317 に答える