Laufzeitbibliothek als "Multithreaded DLL" sorgt für Memory Leak
-
Gerne:
void Test() { std::string strTest; }
Im Header wird diese Funktion in die DLL exportiert, aber sie wird nirgends aufgerufen. Trotzdem seh ich die beiden Memory Leaks, kommentier ich sie aus (gibt keinen Fehler, wird ja nirgends aufgerufen) hab ich keine Memory Leaks mehr!
ChrisM
-
ok, danke. Aber kannst du das Beispiel bitte hochladen? Ich hab keine Lust das ganze zusammenzubauen.
-
OK: http://www.chrismandery.de/LeakTest.zip
In der Main.cpp des Projektes der EXE stehen noch drei Zeilen Hinweise.
ChrisM
-
OK, thx.
Bei mir wird allerdings nur der Leak gedumpt den du mit int *pLeak = new int; erzeugt hast. VC++ .NET 7
-
Post mal deinen Debugoutput, meiner ist:
"ntdll.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\kernel32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
Geladene Symbole für "C:\Dokumente und Einstellungen\Chris\Eigene Dateien\Programmieren\Projekte\LeakTest\Exe\LeakTest.dll"
Geladene Symbole für "C:\WINDOWS\system32\MSVCP60D.DLL"
Geladene Symbole für "C:\WINDOWS\system32\MSVCRTD.DLL"
Detected memory leaks!
Dumping objects ->
{50} normal block at 0x00420040, 4 bytes long.
Data: < > CD CD CD CD
{43} normal block at 0x004200A0, 33 bytes long.
Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD
{42} normal block at 0x004200F0, 40 bytes long.
Data: < |L > 14 7C 4C 10 16 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.
Thread 0x88 wurde mit Code 0 (0x0) beendet.
Das Programm "C:\Dokumente und Einstellungen\Chris\Eigene Dateien\Programmieren\Projekte\LeakTest\Exe\Debug\Exe.exe" wurde mit Code 0 (0x0) beendet.ChrisM
-
'Exe.exe': 'C:\LeakTest\Exe\Debug\Exe.exe' geladen, Symbole geladen. 'Exe.exe': 'C:\WINDOWS\system32\ntdll.dll' geladen, Symbole geladen. 'Exe.exe': 'C:\WINDOWS\system32\kernel32.dll' geladen, Symbole geladen. 'Exe.exe': 'C:\LeakTest\Exe\Debug\LeakTest.dll' geladen, Symbole geladen. 'Exe.exe': 'C:\WINDOWS\system32\msvcp70d.dll' geladen, Symbole geladen. 'Exe.exe': 'C:\WINDOWS\system32\msvcr70d.dll' geladen, Symbole geladen. Detected memory leaks! Dumping objects -> {85} normal block at 0x00325318, 4 bytes long. Data: < > CD CD CD CD Object dump complete. Das Programm "[1628] Exe.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.
-
Komisch!
Was würdest du jetzt machen? Einfach ignorieren oder kein std::string mehr verwenden?ChrisM
-
Hab mir jetzt nochmal den Visual C++ 6 installiert um mir das Problem anzuschauen. Aber deinen Code hätte man noch um einiges verkürzen können. Ich denke mal, das es einfach ein Bug ist. Mit Visual C++ 7 tritt der Fehler auch bei mir nicht auf.
#include <string> #include <crtdbg.h> int main() { std::string s; _CrtDumpMemoryLeaks(); return 0; }
-
Also ich möchte nicht auf std::string verzichten wollen. :p
Aber jetzt hab ich mir die Newsgroup-Artikel nochmal genauer angeschaut:- The first line of your "main" function should always read:
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
Leaks will be dumped automatically on program termination -- no need to
call _CrtDumpMemoryLeaks().Dann klappts, jedenfalls bei mir.
-
Bei mir auch!!
Danke, ihr seid echt super genial!!
ChrisM