0

私の 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     `.U.@>.. .?...?..
    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...」行をダブルクリックすると、コーサーが問題のある行に設定されるはずですよね? しかし、そうではありません。

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

加えて:

  • Visual Studio 2015 を使用しています
  • プロジェクトは C++ Windows フォーム プロジェクトです
  • vld.h を追加インクルードに含め、lib-directory をプロジェクトの追加ライブラリに含めました。
  • 私はとmain()を使用#include <vld.h>_CrtDumpMemoryLeaks()ます。

編集:

My Main (縮小版ですが、同様のレポートが得られます):

//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あります...

4

1 に答える 1

0

問題の正確な場所がわかりません。私にとっては、プログラムを DEBUG モードではなく RELEASE モードで実行すると役に立ちます。

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

によると: C++ で STL リストに push_back() を使用すると、アクセス違反、クラッシュが発生する

C++ クラスを malloc() すると、そのクラスのどのフィールドに対してもコンストラクターは呼び出されません。

そして、VS はクラスnew_scalar.cppのコンストラクターにステップインします。それは Visual Leak Detector (VLD) に依存していると言われています。インクルードでそれらを使用します。

最後に、コードを区別してみてください

#pragma managed

#pragma unmanaged

RELEASEモードで実行します。

于 2016-10-04T22:01:07.743 に答える