2009-07-07 6 views
0

Warum ist der Heap-Speicher immer auf Null gesetzt? Warum ist der Stack-Speicherplatz in ähnlicher Weise nicht auf Null gesetzt?Nicht initialisierte Werte von Heap- und Stack-Speicherplatz

+0

Ohne die Details Ihrer Umgebung zu kennen, gibt es keine Möglichkeit, diese Fragen zu beantworten. – Jherico

+1

@Abhijith - Wie wäre es, wenn Sie die Wikipedia-Seiten auf Anhäufungen nachschlagen und zuerst stapeln ... –

+0

@Nicht sicher, seien Sie nett zu den Neulingen .... –

Antwort

4

Heap-Speicherplatz wird NICHT immer auf Null gesetzt.

+0

Ich machte einen Fehler in meiner Analyse. Entschuldigung. Vielen Dank. –

4

Die Antwort hängt davon ab, welche Sprache (C++, Java usw.) Sie verwenden, vielleicht auf welchem ​​Compiler und vielleicht auch auf den Compiler-Optionen (debug versus release). Außerdem ist das Verhalten möglicherweise nicht garantiert (der zugeordnete Heap kann bei der ersten Zuweisung Null sein, aber später, nachdem Ihr Programm ausgeführt wurde und Sie beginnen, den Heap erneut zu verwenden, stellen Sie möglicherweise fest, dass Sie nicht genulierter Speicher neu zuordnen).

2

Wenn der Heap-Speicher auf Null gesetzt ist, liegt das wahrscheinlich daran, dass er vorher nicht verwendet wurde. Nachdem Sie viele Dinge auf dem Heap zugewiesen, freigegeben und neu zugewiesen haben, werden Sie beginnen, in Ihrem nicht initialisierten Heap-Speicherbereich alte Daten zu finden.

Der Stapel enthält alte lokale Variablen aus anderen Funktionen in Ihrer Aufrufliste. Der Stack wurde so konzipiert, dass er so effizient wie möglich ist, so dass keine Zeit damit verschwendet wird, alte Variablen zu löschen.

Denken Sie auch daran, 0 ist nicht unbedingt der richtige Initialisierer für irgendetwas ... es ist nur eine vernünftige Wahl; Nichts macht es eindeutig "korrekt". Sie sollten IMMER explizit Initialisierungswerte für lokale Variablen setzen!

2

Was Sie sehen, sind Artefakte Ihrer Umgebung, nicht geben. Ich gehe davon aus, dass Sie über C. sprechen.

Aber das heißt, wenn Sie Speicher aus dem Heap reservieren, kann es oder nicht auf Null initialisiert werden. In einer Sprache wie C gibt malloc keine Garantie dafür, dass der Speicher auf 0 initialisiert wird, aber Calloc tut dies. Allerdings, in der Praxis, wenn Sie eine Menge Dinge, die Sie neigen dazu neigen, es mit 0 gefüllt zu sehen. Warum? Wenn Ihr Programm nicht mehr genügend Speicher zur Verfügung hat, wird das Betriebssystem nach mehr Speicher gefragt. Wenn dies der Fall ist, gibt das Betriebssystem dem Speicher eine Menge virtueller Seiten, die es tatsächlich materialisiert, und füllt sie bei seinem ersten Zugriff mit 0s. Nun, wenn Sie einige Werte auf dem Heap freigeben und mehr mit malloc zuweisen, können Sie etwas von diesem "schmutzigen" Speicher zurückgeben, den Sie zuvor beschrieben haben. Wenn Sie annehmen, dass alles auf 0 initialisiert wird, kann dies zu kleinen Fehlern führen, die nur auftreten, wenn das System eine Zeitlang ausgeführt wurde oder nachdem Löschungen in einem komplett anderen Teil des Systems vorgenommen wurden!

Also verlassen Sie sich nicht auf Fresg Speicherplatz aus dem Heap auf 0 initialisiert werden, es sei denn Sie fragen nach explizit initialisiertem Speicher.

Warum der Stack noch schlechter ist, das gleiche Problem der Wiederverwendung von Speicherplatz auf dem Heap, die zufallsbedingten Rauschen in den Speicher, den Sie gerade zugewiesen haben, geschieht auf dem Stapel, aber das Problem ist schlimmer, nachdem Sie von einer Funktion zurückgegeben Ruf an, dein Programm kritzelte gerade eine Menge Zeug über den ganzen Stapel über dir und kümmerte dich nicht darum, es aufzuräumen. Du bist also fast immer im "schmutzigen" Fall.

Am Ende stellen Sie sicher, dass Sie sicherstellen, dass alles, was Sie verwenden möchten, vor dem Lesen in einen bekannten Zustand initialisiert wird.