Ich arbeite an einem Pattern-Suchprogramm, das kontinuierlich aus dem Heap reserviert und freigibt. Das Programm soll sich sehr um die Speichernutzung kümmern. Wenn ich also mit dem Speicher fertig bin, muss er für das Betriebssystem freigegeben werden. Nachdem ich dies gesagt habe, habe ich umfangreiche Speicherleck-Erkennung durchgeführt und alle Lecks gefunden, die auf dem CRT-Dump-Protokoll angezeigt werden, mit Hilfe des Visual Leak-Detektors von Visual Studio und WinDbg für Stack-Tracing. Das Hauptproblem ist, dass je mehr Heap-Aktivität, die bei der Verarbeitung einer Datei auftritt, desto mehr bin ich mit diesem Stück Speicher, der nicht an das Betriebssystem freigegeben ist, aber es zeigt auch nicht als ein Leck nach dem Programm beenden. Ich packe die Ressourcennutzung des Programms diese Zeilen von Code verwendet:Heap intensive C++ Programm
PROCESS_MEMORY_COUNTERS pmc;
GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
PListType physMemUsedByMe = pmc.WorkingSetSize;
return physMemUsedByMe/1000000.0f;
Dadurch wird die Menge an Speicher in MB kehrt das Programm verwendet, und ich mache diesen Anruf direkt, bevor das Programm beendet wird. Ich kann keine Speicherlecks haben, aber bis zu 500 MB dieser verbleibenden Daten. Nicht sicher, ob dieses Zeug irgendwie auf dem Stapel sitzt oder ist diese Haufenfragmentierung? Ich verwende STL-Maps und Vektoren, aber ich bereinige sie richtig, wenn ich Zeiger verwende.
Ich mache schon seit einiger Zeit Detektivarbeit und ich bin wirklich nicht mit Antworten auf solche Foren, also wollte ich meine Frage speziell stellen. Jede Hilfe geht weit. Es spielt keine Rolle, wenn ich nur rate, ich brauche nur etwas Brainstorming außerhalb meines eigenen Kopfes LOL. Vielen Dank!
Haben Sie globale oder lokale statische Variablen? Sie werden nicht zerstört, bis die "Hauptfunktion" zurückgegeben wurde (d. H. Nach Ihrer Überprüfung). Vielleicht enthält die Menge, die Sie zurück erhalten, auch das ausführbare Programm und alle zugeordneten DLLs? Und das ist neben der Antwort von John Zwinck. –
So funktioniert die Speicherzuordnung. Wenn Sie Speicher freigeben, kann er innerhalb desselben Prozesses erneut zugewiesen werden. Er wird jedoch erst wieder an das Betriebssystem zurückgegeben, wenn der Prozess beendet wird. Aber dies ist auch in einem modernen virtuellen Speicherbetrieb weitgehend kein Problem, denn der meiste ungenutzte Speicher, der mit Ihrem Prozess verbunden ist, wird ausgelagert, wenn der physische Speicher unter Druck steht. Aber diese Erinnerung wird * absolut * freigegeben, wenn das Programm beendet wird. –
@JohnBollinger Das sieht wie eine Antwort aus, kein Kommentar. – NathanOliver