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 2025

Video: Stackregister und die Arbeitsweise des Stacks 2025
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

Web Marketing: Warum Suchmaschinen existieren - Dummies

Web Marketing: Warum Suchmaschinen existieren - Dummies

Wenn Sie verstehen, warum Suchmaschinen existieren, können sie für Sie in Ihrem Web-Marketing-Geschäft arbeiten. Also, hier ist eine kurze Lektion, warum Suchmaschinen existieren und wie Sie sie nutzen können, um Geld zu verdienen. Suchmaschinen liefern Relevanz. Relevanz bedeutet, dass Besucher auf Suchergebnisse klicken und zufrieden sind mit ...

Was sind Tür- und Informationsseiten? - dummies

Was sind Tür- und Informationsseiten? - dummies

Eine Doorway-Seite wird nur als Zugang von einer Suchmaschine zu Ihrer Website erstellt. Doorway-Seiten werden manchmal als Gateway-Seiten und Geisterseiten bezeichnet. Die Idee besteht darin, hoch optimierte Seiten zu erstellen, die von Suchmaschinen aufgenommen und indiziert werden und die mit etwas Glück gut ranken und somit den Traffic auf eine ...

Was ist eine Weiterleitung bei der Suchmaschinenoptimierung? - Dummies

Was ist eine Weiterleitung bei der Suchmaschinenoptimierung? - Dummies

Eine Weiterleitung ist das automatische Laden einer Seite ohne Benutzereingriff. Sie klicken auf einen Link, um eine Webseite in Ihren Browser zu laden, und innerhalb von Sekunden verschwindet die geladene Seite, und eine neue wird angezeigt. Designer erstellen häufig Seiten für Suchmaschinen - optimierte, schlüsselwortreiche Seiten -, die Besucher auf die ...

Die Wahl des Herausgebers

Behandeln Probleme mit dem Kundenservice über Social Media - Dummies

Behandeln Probleme mit dem Kundenservice über Social Media - Dummies

, Wenn Kunden wissen, dass sie direkt mit ein Geschäft in den sozialen Medien, können sie aus einer beliebigen Anzahl von Gründen mit ihnen in Verbindung treten. Aber sobald sie merken, dass ein Problem mit dem Kundenservice oder einer Produktfrage über einen einzigen Tweet oder Beitrag angesprochen werden kann, ist es wahrscheinlicher, dass sie mit dem Unternehmen Geschäfte machen.

Acht Möglichkeiten, Social Media Feedback zu erhalten - Dummies

Acht Möglichkeiten, Social Media Feedback zu erhalten - Dummies

Die heutige Technologie verändert die Art und Weise, wie wir Geschäfte machen blitzschnell. Auch der Social-Media-Handel bewegt sich blitzschnell, aber durch die Beobachtung von Erwähnungen und Fragen an die Community können Sie einen Eindruck davon bekommen, wie Ihr Markt über bevorstehende Veränderungen denkt. Auch andere Posts können Ihnen helfen, kritisches Feedback aus der Öffentlichkeit zusammenzustellen ...

Manage Social Media Commerce mit HootSuite - dummies

Manage Social Media Commerce mit HootSuite - dummies

HootSuite ist ein Social Media Management System zur Umsetzung von Outreach und Überwachung in sozialen Netzwerken über ein einziges webbasiertes Dashboard. Für Unternehmen wird HootSuite am häufigsten von Social-Media-Teams mit mehreren Agenten verwendet, aber auch viele Einzelanwender mögen es. Wenn Sie auf der Suche nach einer robusten Plattform sind, die alles an einem Ort hält, ...

Die Wahl des Herausgebers

Die 5 Kornsterne der Mittelmeer - Dummies

Die 5 Kornsterne der Mittelmeer - Dummies

Die Mittelmeerdiät ist in der Praxis des Habens begründet ein Vollkorn zu jeder Mahlzeit. Und nein, das bedeutet nicht, eine ganze Platte Vollkornspaghetti mit Fleischsauce zum Abendessen zu essen. Stattdessen machen die Menschen im Mittelmeerraum ihr Getreide zur Beilage oder schaffen durch die Zugabe von magerem Eiweiß mehr Gleichgewicht ...

Strebe nach Gesundheit mit 7 bis 10 Portionen Obst und Gemüse - Schnuller

Strebe nach Gesundheit mit 7 bis 10 Portionen Obst und Gemüse - Schnuller

Der Verzehr von sieben bis zehn Portionen Obst und Gemüse pro Tag, wie sie für die mediterrane Ernährung empfohlen werden, mag sehr viel erscheinen, aber es muss keine so große Herausforderung sein. Wenn Sie nicht die Früchte und das Gemüse lieben, die spezifisch mit der Mittelmeerdiät verbunden sind, ist das okay! Essen Sie jede Art von Obst oder Gemüse, die Sie ...

Die gesundheitlichen Vorteile von mediterranen Kräutern und Gewürzen - Dummies

Die gesundheitlichen Vorteile von mediterranen Kräutern und Gewürzen - Dummies

Sie haben vielleicht gedacht, dass der Oregano und Basilikum in Ihrer Spaghetti-Sauce lieferte nur einen deutlichen italienischen oder mediterranen Geschmack, aber diese kleinen Kräuter sind Pflanzen, was bedeutet, dass sie alle Arten von gesundheitlichen Vorteilen haben, die einen großen Einfluss auf Ihre allgemeine Gesundheit haben können. Einfache Gewürze wie Ingwer und Oregano enthalten Phytochemikalien, ...