最近、rawポインタを使用してプログラムをstd::shared_ptr
sに変換し、メモリリークがないことを確認したいと思いました。MSDNの「CRTライブラリを使用したメモリリークの検出」ページを確認し、指示に従ってレポートを設定しました。
まず、次の行をファイルに追加します。
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
レポートを-で呼び出します_CrtDumpMemoryLeaks();
私は確かにnew
私のメモリを割り当てるために使用しているので、ページが示唆しているように、私は追加しました...
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
リークのより正確な位置に関しては、大きな変化はありません。代わりに、私のレポートはまだ次のようになっています。
Detected memory leaks!
Dumping objects ->
{158} normal block at 0x006F8458, 8 bytes long.
Data: < , > DC F6 2C 00 00 00 00 00
{155} normal block at 0x006FAD40, 40 bytes long.
Data: <L> > 4C 3E 17 01 03 00 00 00 01 00 00 00 CD CD CD CD
{154} normal block at 0x006FAB68, 16 bytes long.
Data: <d> > 64 3E 17 01 01 00 00 00 01 00 00 00 00 00 00 00
{149} normal block at 0x006FAC08, 40 bytes long.
Data: <L> > 4C 3E 17 01 03 00 00 00 01 00 00 00 CD CD CD CD
{148} normal block at 0x006FABB8, 16 bytes long.
Data: <d> > 64 3E 17 01 01 00 00 00 01 00 00 00 00 00 00 00
Object dump complete.
The program '[7152] List.exe' has exited with code 0 (0x0).
残念ながら、レポートは終了直前に生成されるため、リークをリアルタイムで確認することはできません。
この質問への回答を見ると、空のプロジェクトであるためにpdbファイルをロードしていないことに気付きました。だから私はここで与えられたアドバイスに従いましたが、それはpdbの問題を修正しましたが、私の問題を修正することができませんでした。
それが重要な場合、アプリは空のコンソールアプリケーションから生成され、私は管理者として実行しています。
また、使用できる外部ツールについては知っていますが、追加する権限のないコンピューターを使用することが多いため、VSを正しく機能させることが理想的なソリューションです。リークの行番号を表示するレポートを取得するための助けは素晴らしいでしょう。
サイドノート:
論理的な質問は次のようになると思います-マネージポインタを使用している場合、なぜまだメモリリークが発生するのですか?さて、私はいくつかのローカライズされたポインタを残しましたが、それはある種の一時的なホルダーだけであり、問題を引き起こしてはならなかったようです。だから、どこで起こっているのかはわかっているような気がしますが、これはとても単純なプログラムであり、これがどのように達成されるのかを知りたいので、より大きなプログラムで使用できます。ありがとう。