Jeder Block zugeordneten Speichers innerhalb eines Heapspeichers besteht aus einem Datenbereich, der bei der von der Zuordnungsfunktion zurückgegebenen Adresse beginnt, sowie aus einem Steuerbereich, der an den Datenbereich grenzt und von den Speicherverwaltungsfunktionen zum korrekten Freigeben des Speichers benötigt wird, wenn Sie die Speicherzuordnung aufheben. Wenn sie eine Steuerstruktur im Heapspeicher überschreiben (zum Beispiel indem Sie in Elemente schreiben, die sich außerhalb der zugeordneten Grenzen einer Feldgruppe befinden oder indem Sie eine Zeichenfolge in einen zu kleinen Block zugeordneten Speichers kopieren), werden die Steuerinformationen beschädigt, was zu einem falschen Verhalten des Programms führen kann, selbst wenn die Datenbereiche anderer zugeordneter Blöcke nicht überschrieben wurden.
Beachten Sie die folgenden Punkte, wenn Sie versuchen, Heapspeicherfehler zu lokalisieren:
Um Heapspeicherfehler festzustellen, können Sie Ihr Programm so kompilieren, dass die Heapprüfungsversionen der Speicherverwaltungsfunktionen verwendet werden. (Informationen zur Compileroption -qheapdebug enthält der Abschnitt zur zugehörigen Debug-Compiler-Option.)Wenn Sie ein mit dieser Option kompiliertes Programm ausführen, führt jedes Aufrufen einer Speicherverwaltungsfunktion zu einer Heapprüfung für den Standardheapspeicher.Diese Heapprüfung umfasst eine Überprüfung der Steuerstrukturen jedes zugeordneten Speicherblocks im Heapspeicher, um sicherzustellen, dass nichts überschrieben wurde. Wenn ein Fehler festgestellt wird, wird das Programm beendet und es werden Informationen in Standardfehler geschrieben, einschließlich der Adresse, bei der die Heapspeicherbeschädigung aufgetreten ist, der Quellendatei und der Zeilennummer, bei denen der letzte gültige Heapspeicherstatus festgestellt wurde, sowie der Quellendatei und der Zeilennummer, bei denen der Speicherfehler festgestellt wurde.
Die Heapprüfung ist nur für den Standardheapspeicher aktiviert, der von jeder ausführbaren Datei verwendet wird. Wenn die Debugversionen der Speicherverwaltungsfunktionen keine Heapspeicherbeschädigungen melden, Sie aber dennoch einen Fehler vermuten, verwenden Sie möglicherweise zusätzliche Heapspeicher, die beschädigt wurden.
Sie können die Ursache eines Heapspeicherfehlers aus dem Debugger heraus genau lokalisieren, falls Sie wissen, dass es sich bei dem Heapspeicher, der den Fehler verursacht, um den Standardheapspeicher handelt. Dazu müssen Sie kontinuierlich den Abstand zwischen der letzten Zeile, bei der der Heapspeicher noch in Ordnung war, und der ersten Zeile, bei der die Beschädigung auftrat, eingrenzen. Verwenden Sie eine Kombination aus Ausführungsbefehlen, Step-Befehlen, Zeilen- und Funktionsunterbrechungspunkten sowie die Einstellung Heapprüfung bei Stopp ausführen, um den Suchbereich einzugrenzen. Informationen zu dieser Einstellung finden Sie im zugehörigen Abschnitt.
Bei semantisch nicht korrekten Programmen kann die Verwendung der Funktion Heapprüfung bei Stopp ausführen zu unterschiedlichen Ergebnissen führen, wenn ein Programm nicht korrekt auf Daten im Stack zugreift. Dies liegt daran, dass die Funktion Heapprüfung bei Stopp ausführen den Prozess und den Thread, für die ein Debug durchgeführt wird, veranlasst, bei jeder Unterbrechung der Ausführung eine Funktion zur Heapprüfung aufzurufen und dass diese Funktion zur Heapprüfung den sicheren Bereich des Stacks beeinflusst, indem sie einen Teil dieses Bereichs mit ihrem Stack-Frame überschreibt. Wenn zum Beispiel eine aufgerufene Funktion die Adresse einer lokalen Variablen zurückgibt, kann die aufrufende Funktion auf den Inhalt dieser lokalen Variablen zugreifen, der solange nicht geändert wird, wie der von der aufgerufenen Funktion verwendete Stack-Frame nicht von einem späteren Aufruf überschrieben wird. Wenn Sie jedoch aus der aufgerufenen Funktion heraus einen Befehl 'Step return' ausgeben, während Heapprüfung bei Stopp ausführen aktiv ist, wird die Funktion zur Heapprüfung sofort nach der Rückgabe von der aufgerufenen Funktion ausgeführt, und der Speicher, auf den der zurückgegebene Zeiger verweist, wurde möglicherweise vom Stack-Frame der Funktion zur Heapprüfung überschrieben.
Die Heapprüfung innerhalb des Debuggers verursacht einen hohen Aufwand für Step-Befehle, weil der Heapspeicher nach jedem Schritt geprüft wird. Wenn sich dadurch, dass Sie größere Codeabschnitte schrittweise durchgehen oder häufig an Unterbrechungspunkten stoppen, die Debugleistung stark verringert, versuchen Sie, Heapprüfung bei Stopp ausführen nur für die Bereiche einzusetzen, die vermutlich Heapspeicherfehler verursachen.