Zuhause Persönliche Finanzen Wie der Heap in C ++ funktioniert - Dummies

Wie der Heap in C ++ funktioniert - Dummies

Inhaltsverzeichnis:

Video: Stackregister und die Arbeitsweise des Stacks 2024

Video: Stackregister und die Arbeitsweise des Stacks 2024
Anonim

Der Heapspeicher ist ein amorpher Speicherblock, auf den Ihr C ++ - Programm bei Bedarf zugreifen kann. Erfahren Sie, warum es existiert und wie Sie es verwenden können.

So wie es möglich ist, einen Zeiger an eine Funktion zu übergeben, ist es möglich, dass eine Funktion einen Zeiger zurückgibt. Eine Funktion, die die Adresse eines Double zurückgibt, wird wie folgt deklariert:

double * fn (void);

Sie müssen jedoch sehr vorsichtig sein, wenn Sie einen Zeiger zurückgeben. Um die Gefahren zu verstehen, müssen Sie etwas über den variablen Umfang wissen.

Eingeschränkter Gültigkeitsbereich in C ++

Gültigkeitsbereich ist der Bereich, über den eine Variable definiert ist. Betrachten Sie das folgende Code-Snippet:

// Die folgende Variable ist // für alle Funktionen zugänglich und so lange definiert, wie das // -Programm läuft (globaler Gültigkeitsbereich) int intGlobal; // Die folgende Variable intChild ist // nur für die Funktion zugänglich und wird nur // so lange definiert, wie C ++ child () oder eine // Funktion ausführt, die child () aufruft (function scope) void child (void) {int intChild;} // Die folgende Variable intParent hat eine Funktion // scope void parent (void) {int intParent = 0; Kind(); int intLater = 0; intParent = intLater;} int main (int nArgs, char * pArgs []) {parent ();}

Dieses Programmfragment beginnt mit der Deklaration einer Variablen intGlobal. Diese Variable existiert von dem Zeitpunkt an, an dem das Programm beginnt zu laufen, bis es endet. Sie sagen, dass intGlobal "Programmumfang hat. "Sie sagen auch, dass die Variable" in den Gültigkeitsbereich "geht, noch bevor die Funktion main () aufgerufen wird.

Die Funktion main () ruft sofort parent () auf. Das erste, was der Prozessor in parent () sieht, ist die Deklaration von intParent. Zu diesem Zeitpunkt geht intParent in den Gültigkeitsbereich - das heißt, intParent ist für den Rest der Funktion parent () definiert und verfügbar.

Die zweite Anweisung in parent () ist der Aufruf von child (). Wieder einmal deklariert die Funktion child () eine lokale Variable, diesmal intChild. Der Gültigkeitsbereich der Variablen intChild ist auf die Funktion child () beschränkt. Technisch gesehen ist intParent nicht im Bereich von child () definiert, da child () keinen Zugriff auf intParent hat; Die Variable intParent bleibt jedoch bestehen, während child () ausgeführt wird.

Wenn child () beendet wird, verliert die Variable intChild den Gültigkeitsbereich. Nicht nur ist intChild nicht mehr zugänglich, es existiert nicht mehr. (Der von intChild belegte Speicher wird an den allgemeinen Pool zurückgegeben, um für andere Dinge verwendet zu werden.)

Wenn parent () die Ausführung fortsetzt, geht die Variable intLater in den Gültigkeitsbereich der Deklaration. An dem Punkt, an dem parent () zu main () zurückkehrt, gehen sowohl intParent als auch intLater aus dem Gültigkeitsbereich heraus.

Da intGlobal in diesem Beispiel global deklariert ist, steht es allen drei Funktionen zur Verfügung und bleibt für die gesamte Lebensdauer des Programms verfügbar.

Untersuchen des Bereichsproblems in C ++

Das folgende Codesegment wird ohne Fehler kompiliert, funktioniert aber nicht (hasst du das nicht einfach?):

double * child (void) {double dLocalVariable; return & dLocalVariable;} void übergeordnetes Element (void) {double * pdLocal; pdLocal = Kind (); * pdLocal = 1. 0;}

Das Problem bei dieser Funktion besteht darin, dass dLocalVariable nur innerhalb des Gültigkeitsbereichs der Funktion child () definiert ist. Daher wird zu der Zeit, zu der die Speicheradresse von dLocalVariable von child () zurückgegeben wird, auf eine Variable verwiesen, die nicht mehr existiert. Der Speicher, den dLocalVariable früher belegt hat, wird wahrscheinlich für etwas anderes verwendet.

Dieser Fehler ist sehr häufig, da er sich auf verschiedene Arten ausbreiten kann. Leider führt dieser Fehler nicht dazu, dass das Programm sofort beendet wird. In der Tat kann das Programm die meiste Zeit gut funktionieren - das heißt, das Programm funktioniert weiter, solange der zuvor von dLocalVariable belegte Speicher nicht sofort wiederverwendet wird. Solche intermittierenden Probleme sind am schwierigsten zu lösen.

Bereitstellen einer Lösung unter Verwendung des Heaps in C ++

Das Problem des Bereichs kam dadurch zustande, dass C ++ den lokal definierten Speicher zurücknahm, bevor der Programmierer bereit war. Was benötigt wird, ist ein Speicherblock, der durch den Programmierer gesteuert wird. Sie kann den Speicher reservieren und zurücksetzen, wenn sie will - nicht weil C ++ denkt, dass es eine gute Idee ist. Ein solcher Speicherblock wird als Heap bezeichnet.

Der Heap-Speicher wird mit dem neuen Schlüsselwort zugewiesen, gefolgt vom Typ des zuzuweisenden Objekts. Der neue Befehl unterbricht einen Speicherblock aus dem Heap, der groß genug ist, um den angegebenen Objekttyp aufzunehmen, und gibt seine Adresse zurück. Zum Beispiel weist das Folgende eine Doppelvariable aus dem Heap zu:

double * child (void) {double * pdLocalVariable = new double; return pdLocalVariable;}

Diese Funktion funktioniert jetzt ordnungsgemäß. Obwohl die Variable pdLocalVariable den Gültigkeitsbereich verlässt, wenn die Funktion child () zurückgegeben wird, gilt dies nicht für den Speicher, auf den pdLocalVariable verweist. Ein von new zurückgegebener Speicherort verlässt den Gültigkeitsbereich nicht, bis er explizit mit dem Schlüsselwort delete, das speziell für diesen Zweck entwickelt wurde, an den Heap zurückgegeben wird:

void parent (void) {// child () gibt die Adresse zurück eines Blocks // des Heap-Speichers double * pdMyDouble = child (); // speichere einen Wert dort * pdMyDouble = 1. 1; // … // gibt jetzt den Speicher an den Heap zurück löschen pdMyDouble; pdMyDouble = 0; // …}

Hier wird der von child () zurückgegebene Zeiger verwendet, um einen doppelten Wert zu speichern. Nachdem die Funktion mit dem Speicherplatz beendet wurde, wird sie an den Heap zurückgegeben. Die Funktion parent () setzt den Zeiger auf 0, nachdem der Heapspeicher zurückgegeben wurde - dies ist keine Voraussetzung, aber es ist eine sehr gute Idee.

Wenn der Programmierer versehentlich nach dem Löschen versucht, etwas in * pdMyDouble zu speichern, stürzt das Programm sofort mit einer aussagekräftigen Fehlermeldung ab.

Sie können new auch zum Zuweisen von Arrays aus dem Heap verwenden, aber Sie müssen ein Array mit dem Schlüsselwort delete [] zurückgeben:

int * nArray = new int [10]; nArray [0] = 0; löschen [] nArray;

Technisch neu int [10] ruft den neuen Operator [] auf, funktioniert aber genauso wie neu.

Wie der Heap in C ++ funktioniert - Dummies

Die Wahl des Herausgebers

Zum Hinzufügen von Arbeitsblättern zu Ihrer Excel 2013-Arbeitsmappe - dummies

Zum Hinzufügen von Arbeitsblättern zu Ihrer Excel 2013-Arbeitsmappe - dummies

Jede leere Arbeitsmappe, die Sie öffnen, enthält ein Einzelblatt mit dem prosaischen Namen Sheet1. Um weitere Blätter zu Ihrer Arbeitsmappe in Excel 2013 hinzuzufügen, klicken Sie einfach auf die Schaltfläche Neues Blatt in der Statusleiste (die mit Pluszeichen in einem Kreis). Jedes Arbeitsblatt, das Sie mit der Befehlsschaltfläche Neues Blatt hinzufügen, ist ...

Wie man bedingte Formatierung in Excel 2010 anwendet - dummies

Wie man bedingte Formatierung in Excel 2010 anwendet - dummies

Mit der bedingten Formatierung von excel 2010 können Sie das Aussehen von eine Zelle basierend auf ihrem Wert oder dem Wert einer anderen Zelle. Sie geben bestimmte Bedingungen an, und wenn diese Bedingungen erfüllt sind, wendet Excel die Formatierung an, die Sie auswählen. Sie können die bedingte Formatierung verwenden, um Datumsangaben zu suchen, die bestimmte Kriterien erfüllen (z. B. fallen auf ...

Die Wahl des Herausgebers

ASVAB Vorbereitung: Wie man Brüche multipliziert und dividiert - Dummies

ASVAB Vorbereitung: Wie man Brüche multipliziert und dividiert - Dummies

Es wird erwartet, dass festes Verständnis des mathematischen Grundwissens, wenn Sie das ASVAB nehmen. Multiplizieren und Dividieren von Brüchen sind zwei der Dinge, die Sie wissen müssen. Fraktionen multiplizieren Fraktionen multiplizieren ist sehr einfach. Alles, was Sie tun müssen, ist, die Zähler untereinander zu multiplizieren und die Nenner mit ... zu multiplizieren.

ASVAB-Praxis: Beispiel-Fragen zu Word-Kenntnissen - Dummies

ASVAB-Praxis: Beispiel-Fragen zu Word-Kenntnissen - Dummies

Sie müssen für die Word-Wissensprobleme bereit sein auf dem ASVAB. Das Format, das Sie unten sehen, ist ein gutes Beispiel dafür, was Sie finden werden, wenn Sie das ASVAB benutzen. Beispielfragen Wortwissenszeit: 11 Minuten für 35 Fragen Anleitung: Der Wortwissensubtest ist der dritte Untertest ...

ASVAB: Paragraph Comprehension Subtest Beispiel Testfragen - Dummies

ASVAB: Paragraph Comprehension Subtest Beispiel Testfragen - Dummies

Zeit für Sie, all Ihre ASVAB Vorbereitung zur guten Verwendung. Fragen Sie sich anhand der folgenden Beispieltestfragen, ob Ihr Leseverständnis auf dem neuesten Stand ist. Lesen Sie jeden kurzen Absatz, dem eine oder mehrere Fragen zu den in dieser Passage enthaltenen Informationen folgen. Achten Sie darauf, den Absatz sorgfältig zu lesen ...

Die Wahl des Herausgebers

Zoomen und Schwenken in AutoCAD - Dummys

Zoomen und Schwenken in AutoCAD - Dummys

AutoCAD erleichtert das Schwenken, indem es Bildlaufleisten und Echtzeit-Schwenken bietet. Beim Echtzeit-Panning (im Gegensatz zum Vorgabezeit-Panning?) Können Sie Objekte auf dem Bildschirm sehen, wenn Sie die Maus nach oben und unten oder vor und zurück bewegen. Natürlich bewegt sich der Standpunkt, nicht die Objekte. Sowohl das Schwenken als auch das Zoomen ändern die Ansicht ...

Mit AutoCAD LT 2005 DesignCenter - Dummies

Mit AutoCAD LT 2005 DesignCenter - Dummies

DesignCenter ist ein dummer Name für eine nützliche, wenn auch etwas ausgelastete Palette. Die DesignCenter-Palette ist praktisch für das Extrahieren von Daten aus allen Arten von Zeichnungen. Während sich die Eigenschaftenpalette mit Objekteigenschaften beschäftigt, behandelt die DesignCenter-Palette hauptsächlich benannte Objekte: Ebenen, Linientypen, Blockdefinitionen (dh Symboldefinitionen), Textstile und andere Organisationsobjekte ...

Was Sie über AutoCAD-Koordinatensysteme wissen sollten - Dummies

Was Sie über AutoCAD-Koordinatensysteme wissen sollten - Dummies

Jeder Punkt in einer AutoCAD-Zeichnungsdatei kann identifiziert werden durch seine X-, Y-, Z-Koordinaten. (In den meisten 2D-Zeichnungen ist der Z-Koordinatenwert 0. 0.) Dieses Koordinatensystem wird in AutoCAD als Weltkoordinatensystem oder WCS bezeichnet. Koordinateneingabe Die direkteste Methode, um Punkte präzise einzugeben, ist die Eingabe von Zahlen mit dem ...