2016-04-26 10 views
2

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!

+0

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

+3

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

+0

@JohnBollinger Das sieht wie eine Antwort aus, kein Kommentar. – NathanOliver

Antwort

4

Nur weil Sie freien Speicher nicht bedeutet, dass es sofort an das Betriebssystem zurückgegeben wird. Ihre Standardbibliothek hat wahrscheinlich einen Stapel Speicher, den sie vom Betriebssystem erhalten hat, der aber in Ihrem Programm nicht aktuell ist. Dies ist kein Speicherleck, und es ist in der Praxis normalerweise kein Problem.

+0

Sagen wir zum Beispiel, ich möchte ein Programm ausführen, dem nur 4 GB gleichzeitig zugewiesen werden können, und dieser Speicher erhöht sich und nimmt mit der Zeit zu. Irgendwann werde ich nicht genug Speicher haben, um mein Programm zu starten. Die Natur meines Programms ist, dass es für Tage hintereinander laufen kann und ich befürchte, den Speicher freizugeben, der zu dem OS freigegeben wird, könnte schließlich Paging verursachen ... – PeterMorley

+1

@ user3734523 Der Speicher, den Sie freigeben, kann noch * zu * Ihrem * zugeordnet bleiben Prozess bedeutet es nicht, dass es für andere Prozesse nicht verfügbar ist. Wenn das Betriebssystem es für notwendig erachtet, wird die Zuordnung der Seiten von Ihrem Prozess aufgehoben und anderen Prozessen überlassen. –

+1

@ user3734523: Das ist die Art von Sache, dass es besser ist, sich nicht zu viel im Voraus Sorgen zu machen. Schreiben Sie Ihren Code, führen Sie ihn aus und sehen Sie, welche tatsächlichen Probleme Sie haben. Dann löse diese. –