0

私のC++プロジェクトのいくつかの(奇妙な)問題のため、私はVisual Leak Detectorを使ってメモリリークのプロジェクトをチェックしました。 だから私はi.aを得た。 follwoingレポート:(VS15 C++)Visual Leak Detectorレポートを入手しましたが、今は何ですか?

WARNING: Visual Leak Detector detected memory leaks! 
---------- Block 4 at 0x004D07B0: 200 bytes ---------- 
    Leak Hash: 0xD2D1B4A0, Count: 1, Total 200 bytes 
    Call Stack (TID 8796): 
    ucrtbase.dll!malloc() 
    f:\dd\vctools\crt\vcstartup\src\heap\new_scalar.cpp (19): LASS.exe!operator new() + 0x8 bytes 
    clr.dll!0x72D616E5() 
    Data: 
    28 75 14 03 00 00 00 00 01 00 00 00 00 00 00 00  (u...... ........ 
    9A 99 99 99 99 99 B9 3F 50 00 00 00 0A 00 00 00  .......? P....... 
    00 00 00 00 F4 01 00 00 00 00 00 00 01 00 00 00  ........ ........ 
    7B 14 AE 47 E1 7A 74 3F 14 00 00 00 BA FF FF FF  {..G.zt? ........ 
    00 00 00 00 F4 01 00 00 00 00 00 00 01 00 00 00  ........ ........ 
    7B 14 AE 47 E1 7A 84 3F 00 00 00 00 64 00 00 00  {..G.z.? ....d... 
    00 00 00 00 01 00 00 00 14 00 00 00 46 00 00 00  ........ ....F... 
    00 00 00 00 64 00 00 00 00 00 00 00 F4 01 00 00  ....d... ........ 
    01 00 00 00 B8 E2 13 03 F0 AD 18 03 00 00 00 00  ........ ........ 
    C8 E2 13 03 C8 AB 18 03 00 00 00 00 78 E3 13 03  ........ ....x... 
    B8 AC 18 03 00 00 00 00 68 E2 13 03 E8 AC 18 03  ........ h....... 
    00 00 00 00 14 00 00 00 01 00 00 00 64 00 00 00  ........ ....d... 
    01 00 00 00 00 00 00 00         ........ ........ 


---------- Block 20 at 0x004D0880: 200 bytes ---------- 
    Leak Hash: 0xD2D1B4A0, Count: 1, Total 200 bytes 
    Call Stack (TID 8796): 
    ucrtbase.dll!malloc() 
    f:\dd\vctools\crt\vcstartup\src\heap\new_scalar.cpp (19): LASS.exe!operator new() + 0x8 bytes 
    clr.dll!0x72D616E5() 
    Data: 
    78 74 14 03 00 00 00 00 01 00 00 00 00 00 00 00  xt...... ........ 
    9A 99 99 99 99 99 B9 3F 50 00 00 00 0A 00 00 00  .......? P....... 
    00 00 00 00 F4 01 00 00 00 00 00 00 01 00 00 00  ........ ........ 
    7B 14 AE 47 E1 7A 74 3F 14 00 00 00 BA FF FF FF  {..G.zt? ........ 
    00 00 00 00 F4 01 00 00 00 00 00 00 01 00 00 00  ........ ........ 
    7B 14 AE 47 E1 7A 84 3F 00 00 00 00 64 00 00 00  {..G.z.? ....d... 
    00 00 00 00 01 00 00 00 14 00 00 00 46 00 00 00  ........ ....F... 
    00 00 00 00 64 00 00 00 00 00 00 00 F4 01 00 00  ....d... ........ 
    01 00 00 00 38 E2 13 03 00 F0 15 03 00 00 00 00  ....8... ........ 
    B8 E1 13 03 88 00 7F 05 00 00 00 00 08 E2 13 03  ........ ........ 
    20 FF 7E 05 00 00 00 00 E8 E1 13 03 80 FF 7E 05  ..~..... ......~. 
    00 00 00 00 14 00 00 00 01 00 00 00 64 00 00 00  ........ ....d... 
    01 00 00 00 00 00 00 00         ........ ........ 


---------- Block 31 at 0x0053E1B8: 72 bytes ---------- 
    Leak Hash: 0x3F88029B, Count: 1, Total 72 bytes 
    Call Stack (TID 8796): 
    ucrtbase.dll!malloc() 
    f:\dd\vctools\crt\vcstartup\src\heap\new_scalar.cpp (19): LASS.exe!operator new() + 0x8 bytes 
    clr.dll!0x72D616E5() 
    Data: 
    60 BC 55 00 40 3E 80 05 A0 3F 80 05 A0 3F 80 05  `[email protected]>.. .?...?.. 
    60 BB 55 00 20 34 18 03 00 00 00 00 00 00 00 00  `.U..4.. ........ 
    00 00 00 00 20 00 00 00 2F 00 00 00 80 BC 55 00  ........ /.....U. 
    00 2E 18 03 00 00 00 00 00 00 00 00 00 00 00 00  ........ ........ 
    20 00 00 00 2F 00 00 00         ..../... ........ 


---------- Block 33 at 0x0055BB60: 8 bytes ---------- 
    Leak Hash: 0xA49C5AA6, Count: 1, Total 8 bytes 
    Call Stack (TID 8796): 
    ucrtbase.dll!malloc() 
    f:\dd\vctools\crt\vcstartup\src\heap\new_scalar.cpp (19): LASS.exe!operator new() + 0x8 bytes 
    clr.dll!0x72D616E5() 
    Data: 
    C8 E1 53 00 00 00 00 00        

    ..S..... ........ 

    //And many more... 

は、残念ながら私は、VLDが問題だと言って何を望んでいるか、理解していません。 "f:\ dd ..."をダブルクリックすると、私の娘さんが問題のある行になるはずです。しかし、それはしません。

私の質問は次のとおりです。問題の領域に移動するにはどうすればいいですか。つまり、「これらのレポートを読むにはどうすればよいですか?また

  • 私はプロジェクトはC++のWindowsは、私が追加に含まれ、追加とlibディレクトリにあるvld.hを含むプロジェクト
  • フォームでのVisual Studio 2015
  • を使用プロジェクトのライブラリ
  • main()では、#include <vld.h>_CrtDumpMemoryLeaks()を使用しています。

EDIT:

私のメイン(縮小版が、同様のレポートを提供します):

//some class-includes 
#include <vld.h> 

using namespace System; 
using namespace System::Windows::Forms; 
using namespace std; 

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

[STAThread] 
void Main() 
{ 
    Application::EnableVisualStyles(); 
    Application::SetCompatibleTextRenderingDefault(false); 


    Experiment* experiment = new Experiment(); 
    Experiment_List* running_experiments = new Experiment_List(); 

    while(!experiment->end) { 
     experiment= new Experiment(); 

     LASS::MainWindow form(experiment, running_experiments); 
     form.ShowDialog(); 

     if(!experiment->end){ 
      running_experiments->register_experiment(experiment); 
     } 
    } 

    running_experimente->end_all(); 

    _CrtDumpMemoryLeaks(); 

    exit(0); 
} 

私が投稿したくないことを約40クラス、...

がありますUnfortunatley
+0

報告されたスタックが不完全である可能性があります。これをチェックしましたか:http://stackoverflow.com/a/36384356/3336423? – jpo38

+0

vldはCLRでも動作しますか?私はそれがネイティブコードだと思った。 – drescherjm

+0

@ jpo38:データに疑問符を追加するだけです。残りは同じように見える... –

答えて

0

問題の正確な場所はわかりません。 DEBUGモードではなく、RELEASEモードでプログラムを実行すると便利です。

私の問題は、マネージドコードとアンマネージコードを一緒に扱うことだと思います。 管理コード内にアンマネージコードがあります。 CLRがデバッグモードで別の新しい演算子を使用しているかのようにつなぎます。 C++標準に準拠していません。よると

Using push_back() for STL List in C++ causes Access Violation, Crash

もしあなたのmalloc()、何のコンストラクタは のいずれか、そのクラスのフィールド

そして、VSは、コンストラクタ内にステップしますのために呼び出されませんC++クラスクラス new_scalar.cpp。人々はそれがVisual Leak Detector(VLD)に依存していると言います。あなたはあなたのインクルードでそれらを使用します。最後に

は、

#pragma managed 

#pragma unmanaged 

でコードを区別し、RELEASEモードで実行してみてください。

関連する問題