0

wegen einiger (seltsamer) Probleme in meinem C++ - Projekt benutzte ich Visual Leak Detector (zum ersten Mal), um das Projekt auf Speicherlecks zu überprüfen. So habe ich i.a. die follwoing Berichte:(VS15 C++) Habe einen visuellen Lecksucher Bericht, aber was nun?

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... 

Unfortunatly verstehe ich nicht, was VLD sagen will, ist das Problem. Mit einem Doppelklick auf die "f: \ dd ..." - Zeile sollte mein Courser auf die Zeile mit dem Problem gesetzt werden, oder? Aber es geht nicht.

Meine Frage ist jetzt: Wie komme ich in den Bereich des Problems oder mit anderen Worten "Wie lese ich diese Berichte?"

Zusätzlich:

  • Ich verwende Visual Studio 2015
  • Das Projekt ist ein C++ Windows-Forms-Projekt
  • ich die vld.h, die in der zusätzlichen enthält und das lib-Verzeichnis der zusätzlichen Bibliotheken des Projekts
  • In der main() verwende ich #include <vld.h> und _CrtDumpMemoryLeaks();

EDIT:

My Main (eine reduzierte Version, sondern gibt ähnliche Berichte):

//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); 
} 

Unfortunatley gibt es etwa 40 Klassen, das will ich nicht schreiben ...

+0

Möglicherweise ist der gemeldete Stapel unvollständig. Haben Sie dies überprüft: http://StackOverflow.com/a/36384356/3336423? – jpo38

+0

Funktioniert Vld sogar mit CLR? Ich dachte, es wäre nur nativer Code. – drescherjm

+0

@ jpo38: Dies fügt nur mehr Fragezeichen zu den Daten hinzu. Der Rest sieht gleich aus ... –

Antwort

0

Ich weiß nicht, wo das Problem genau ist. Für mich hilft es, das Programm im RELEASE-Modus statt im DEBUG-Modus laufen zu lassen.

Ich vermute, mein Problem ist die Handhabung von verwaltetem und nicht verwaltetem Code zusammen. Ich habe nicht verwalteten Code in verwaltetem Code. Es scheint, als ob CLR einen anderen neuen Operator im Debug-Modus verwendet. Nicht so konform wie der C++ Standard.

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

Wenn Sie malloc() eine C++ Klasse, werden keine Konstruktoren für alle betreffenden Klasse Felder

Und der VS wird in einen Konstruktor Schritt aufgerufen werden in Klasse new_scalar.cpp. Leute sagen, dass ist abhängig von dem visuellen Lecksucher (VLD). Sie verwenden sie in Ihren Includes.

Am Ende versuchen, Ihren Code mit

#pragma managed 

und

#pragma unmanaged 

und laufen in RELEASE Modus zu unterscheiden.

Verwandte Themen