Stack vs. Heap Speicher
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 12 von 104.
C++-Programme verwenden zwei wichtige Speicherbereiche: den stack und den heap. Zu verstehen, wo deine Objekte leben, ist entscheidend, um effizienten und fehlerfreien Code zu schreiben.
Der Stack ist ein schneller, automatisch verwalteter Speicher. Variablen, die innerhalb von Funktionen deklariert werden, leben hier und werden automatisch zerstört, wenn sie ihren Gültigkeitsbereich verlassen.
void example() {
int x = 10; // Stack-Allokation
Player player; // Stack-Allokation - wird automatisch zerstört
} // x und player werden hier zerstörtDer heap ist größere, aber langsamere memory, die du manuell verwaltest. Objekte auf dem heap bleiben bestehen, bis du sie ausdrücklich delete.
void example() {
Player* player = new Player(); // Heap-Allokation
// player existiert, bis er gelöscht wird
delete player; // Manuelle Bereinigung erforderlich
}Wichtige Unterschiede:
| Stack | Heap |
|---|---|
| Schnelle allocation | Langsamere allocation |
| Begrenzte Größe | Große Kapazität |
| Automatische cleanup | Manual cleanup erforderlich |
| Objekte fester Größe | Objekte dynamischer Größe |
Verwende stack allocation für kleine, kurzlebige Objekte. Verwende heap allocation, wenn Objekte ihren Gültigkeitsbereich überdauern müssen oder wenn ihre Größe zur Laufzeit bestimmt wird.
Das Vergessen, Heap-Speicher zu löschen, verursacht memory leaks, eine häufige Fehlerquelle in C++-Programmen.
Aufgabe
EinfachSehen wir uns den Unterschied zwischen Stack- und Heap-Speicher an, indem wir eine einfache Counter-Klasse erstellen, die verfolgt, wie Objekte erstellt und destroyed werden.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
Counter.h: Definiere eineCounter-Klasse mit einem privatenname-Attribut (String). Füge einen constructor hinzu, der einen Namen entgegennimmt und"Creating: <name>"ausgibt, sowie einen destructor, der"Destroying: <name>"ausgibt. Füge einegetName()-method hinzu, die den Namen des counters zurückgibt.main.cpp: Demonstriere sowohl Stack- als auch heap allocation. Lies einen Namen aus dem input ein und:- Erstelle einen Stack-zugewiesenen
Countermit diesem Namen - Erstelle einen heap-zugewiesenen
Countermit dem Namen"HeapCounter" - Gib beide counter-Namen im format
"Stack: <name>"und"Heap: <name>"aus - Führe delete für den heap-zugewiesenen counter aus, um ein memory leak zu prevent
- Erstelle einen Stack-zugewiesenen
Beobachte, wie die Meldungen des constructors und destructors in unterschiedlicher Reihenfolge erscheinen, abhängig davon, wann du jedes Objekt erstellst und löschst. Das Stack-Objekt wird automatisch destroyed, wenn main() endet, während das Heap-Objekt ausdrücklich gelöscht werden muss.
include deine Header-Datei in main.cpp mit #include "Counter.h".
Probier es selbst
#include <iostream>
#include <string>
#include "Counter.h"
using namespace std;
int main() {
// Namen von der Eingabe lesen
string inputName;
cin >> inputName;
// TODO: Erstelle einen stack-allokierten Counter unter Verwendung von inputName
// TODO: Erstelle einen heap-allokierten Counter mit dem Namen "HeapCounter"
// TODO: Print stack counter name in format "Stack: <name>"
// TODO: Gib den Namen des Heap-Counters im Format "Heap: <name>" aus
// TODO: Lösche den heap-allokierten Counter, um ein Speicherleck zu verhindern
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische ContainerÜbe selbstständig: Online-C++-Compiler