Visual Studio 2008 (C ++) Erkennung von Speicherlecks zeigt den Speicherort der Datei / Methode nicht an - wie funktioniert das?

8

Ich verwende die Anleitung hier , um nach Speicher zu suchen Lecks in einer Win32-Anwendung. Wie beschrieben, stelle ich das

%Vor%

Zeilen am Anfang einer Datei (die cpp-Datei, die WINAPI _tWinMain enthält) und dann am exit-Punkt von winmain habe ich

hinzugefügt %Vor%

Leider sehe ich nicht die Zeilennummern / Stellen für die Lecks (aber ich bekomme eine Liste von Lecks).

Ich habe auch versucht,

zu setzen %Vor%

am Anfang von Winmain - und wieder, kein Glück.

Ich finde das merkwürdig, weil ich normalerweise keine Probleme hatte, Lecks zu finden oder sie automatisch melden zu lassen.

Dies ist eine riesige, alte Legacy-App, an der ich für einen neuen Arbeitgeber arbeite. In der Vergangenheit habe ich mit dem Standard-VS-Assistenten gearbeitet.

Irgendwelche Vorschläge, wie man Quellenlinien / Methoden, die Lecks verursachen, bekommen kann? (oder zumindest die Zeilen für die "neuen" Anrufe?

BEARBEITEN:

Ich habe auch ein visuelles Lecksuchgerät ausprobiert - ohne Erfolg.

Sehr seltsam.

BEARBEITEN

Ich habe versucht, die Neudefinition von new wie unten aufgeführt zu verwenden, bekomme jedoch Fehler, wenn Boost kompiliert wird.

    
Tim 14.10.2009, 17:43
quelle

1 Antwort

6

Sind Sie sicher, dass der Code, der leckt, die CRT-Debugzuweisungsroutinen verwendet? Das erfordert die Verwendung von malloc() oder new (im Gegensatz zu LocalAlloc , GlobalAlloc , einige benutzerdefinierte Blockzuordner, etc ..) und dass _DEBUG (denke ich) muss definiert werden, wenn die CRT-Header enthalten waren.

Um Quellzeilen auf Lecks zu bekommen, müssen Sie DEBUG_NEW überall, wo die Zuweisungen stattfinden. Dies liegt daran, dass, um sie zu verfolgen, jede Zuweisung durch einen Aufruf ersetzt werden muss, der __FILE__ und __LINE__ enthält. Die Standarddefinition des Assistenten sieht ungefähr so ​​aus:

%Vor%

Dies behandelt malloc nicht, es gibt wahrscheinlich eine ähnliche Beschwörungsformel dafür, wenn der Code, den Sie debuggen, malloc anstelle von new verwendet.

Wenn Sie vorkompilierte Header verwenden, können Sie dies einfach in die vorkompilierte Header-Datei einfügen, und dies wirkt sich auf alle Quelldateien in diesem Projekt aus.

    
Tim Sylvester 14.10.2009 17:59
quelle