3

最近、rawポインタを使用してプログラムをstd::shared_ptrsに変換し、メモリリークがないことを確認したいと思いました。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を正しく機能させることが理想的なソリューションです。リークの行番号を表示するレポートを取得するための助けは素晴らしいでしょう。

サイドノート:

論理的な質問は次のようになると思います-マネージポインタを使用している場合、なぜまだメモリリークが発生するのですか?さて、私はいくつかのローカライズされたポインタを残しましたが、それはある種の一時的なホルダーだけであり、問​​題を引き起こしてはならなかったようです。だから、どこで起こっているのかはわかっているような気がしますが、これはとても単純なプログラムであり、これがどのように達成されるのかを知りたいので、より大きなプログラムで使用できます。ありがとう。

4

3 に答える 3

1

stdlib の定義とインクルードが、アプリケーション内の他のインクルードの前にあることを確認する必要があります。

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

アプリケーションの最初にある必要があります。

于 2015-10-02T08:28:47.883 に答える
0

入れなければならないことがわかりました

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

割り当ての潜在的なソースである可能性のあるすべてのファイルで。メインプログラムでのみ行う必要があると仮定しました。

_CrtDumpMemoryLeaks();

と呼ばれます。

于 2021-03-28T14:26:42.357 に答える