2010-07-08 5 views
16

Ich arbeite an einem Spiel mit SDL in Visual Studio 2010. Ich bin auf das _CrtDumpMemoryLeaks() Makro gestoßen und dachte, ich würde es versuchen. Das Aufrufen von _CrtDumpMemoryLeaks() führt Speicherverluste in das Ausgabefenster aus, aber es zeigt nicht, wo es passiert.C++ - Speicherlecktest mit _CrtDumpMemoryLeaks() - Gibt keine Zeilennummern aus

Ich habe den MSDN-Artikel unter Memory Leak Detection Enabling gelesen, und es erklärt, dass, wenn ich _CRTDBG_MAP_ALLOC definiere es sollte die Zeilennummer der beanstandeten Anweisung ausgeben. In meinem Fall passiert das nicht. (Ich konnte es jedoch zum Laufen bringen, wenn ich malloc() direkt benutze - nicht mit 'neu').

Der Code:

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

int main(int argc, char *argv[]) { 
    int *var = new int(5); 

    _CrtDumpMemoryLeaks(); 

    return 0; 
} 

Der Ausgang ist die folgende:

 
Detected memory leaks! 
Dumping objects -> 
{58} normal block at 0x007D1510, 4 bytes long. 
Data: < > 05 00 00 00 
Object dump complete. 

If _CrtDumpMemoryLeaks() zur Ausgabe von Zeilennummern nicht in der Lage ist, bei der Verwendung von ‚neue‘ dann Vorschläge für andere Möglichkeiten, die Zuteilung eines ähnliches Verhalten zu erreichen, wird geschätzt.

Antwort

9

Wenn Sie _DEBUG definieren und <crtdbg.h> Sie eine überladene operator new bekommen, die zusätzliche Parameter übernimmt mit dem Sie die Datei und Zeilennummern in der Platzierung können new Ausdrücke angeben.

z.

int* p = new (_NORMAL_BLOCK, __FILE__, __LINE__) int(5); 

Sie können dies in einem bedingt definierten Makro, z.

#ifdef _DEBUG 
#define DEBUG_NEW_PLACEMENT (_NORMAL_BLOCK, __FILE__, __LINE__) 
#else 
#define DEBUG_NEW_PLACEMENT 
#endif 

int* p = new DEBUG_NEW_PLACEMENT int(5); 

Während Sie Leute sehen ein bestimmendes Makro new auf dieses Formular vollständig Client-Code zu verbergen, ich persönlich nicht empfehlen, da es etwas bricht bereits absichtlich Platzierung neu verwenden und Sie müssen sicherstellen, dass alle Header Platzierung mit Neu (wie viele Standard-Header) sind enthalten, bevor ein Header new neu definiert. Dies kann es leicht machen, einige Inline-Verwendungen von new in Header-Dateien durchzulassen, ohne "angepasst" zu werden.

3

Sie können diese definiert benötigen nach dem


#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
+0

Das ist MFC nur – humbagumba

+1

Nein, es funktioniert einwandfrei ohne MFC. – msteiger

+7

Erstens, dies neu definiert, was ein bisschen schrecklich ist und bricht jede bestehende Platzierung neue Nutzungen; Zweitens benötigt es eine gültige Definition für 'DEBUG_NEW', die nur in einer Standard-VC-Installation in' afx.h' bereitgestellt wird, die sehr viel ein MFC-Header ist. –

8

enthält, die eine alte Version von Visual Leak Detector ist.

Versuchen Sie folgendes: http://vld.codeplex.com/

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Ich lösche meine Antwort zugunsten Ihrer. Außerdem sollten Sie Ihre Antwort eher wie eine tatsächliche Antwort anstatt eines Kommentars schreiben. –

+0

Die neue Version von VLD funktionierte wie angekündigt und half dabei, eine Menge kleiner Speicherlecks zu finden, komplett mit Anruflisten und Zeilennummern. Hurra. –

2

Die akzeptierte Antwort von Charles Bailey erfordert, dass Sie Ihren Quellcode ändern, und das ist nicht notwendig. Wenn Sie new und delete (oder die Array-Versionen) verwenden, müssen Sie dieses Code-Snippet in die Datei stdafx.h jedes Ihrer Projekte (einschließlich aller statischen oder dynamischen Bibliotheksabhängigkeiten) einfügen und es wird dann eine Quelle angegeben Datei und die Zeilennummer zu jedem durchgesickerten Speicherobjekt angehängt:

#ifdef _DEBUG 
    #ifndef DBG_NEW 
     #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
     #define new DBG_NEW 
    #endif 
#endif // _DEBUG 

Dies kommt direkt von der Microsoft-webpage über die Angelegenheit.

Verwandte Themen