Menu
Coddy logo textTech

Pamięć stosu a sterty

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 12 z 104.

Programy w C++ korzystają z dwóch głównych obszarów pamięci: stosu i sterty. Zrozumienie, gdzie znajdują się obiekty, ma kluczowe znaczenie dla pisania wydajnego kodu wolnego od błędów.

Stos to szybka pamięć zarządzana automatycznie. Zmienne zadeklarowane wewnątrz funkcji znajdują się tutaj i są automatycznie niszczone, gdy wychodzą poza zakres.

void example() {
    int x = 10;           // Alokacja na stosie
    Player player;        // Alokacja na stosie - niszczony automatycznie
}   // x i player są tutaj niszczone

Stos to większa, ale wolniejsza pamięć, którą zarządzasz ręcznie. Obiekty na stercie istnieją, dopóki ich jawnie nie usuniesz.

void example() {
    Player* player = new Player();  // Alokacja na stercie
    // player istnieje, dopóki nie zostanie usunięty
    delete player;                   // Wymagane ręczne zwolnienie pamięci
}

Najważniejsze różnice:

StosSterta
Szybka alokacjaWolniejsza alokacja
Ograniczony rozmiarDuża pojemność
Automatyczne czyszczenieWymagane ręczne czyszczenie
Obiekty o stałym rozmiarzeObiekty o dynamicznym rozmiarze

Używaj alokacji na stosie dla małych obiektów o krótkim czasie życia. Używaj alokacji na stercie, gdy obiekty muszą istnieć dłużej niż ich zakres lub gdy ich rozmiar jest określany w czasie działania programu.

Zapominanie o zwalnianiu pamięci sterty powoduje wycieki pamięci, które są częstym źródłem błędów w programach C++.

challenge icon

Wyzwanie

Łatwy

Przyjrzyjmy się różnicy między pamięcią stosu i sterty, tworząc prostą klasę Counter, która śledzi, kiedy obiekty są tworzone i niszczone.

Utwórz dwa pliki, aby uporządkować swój kod:

  • Counter.h: Zdefiniuj klasę Counter z prywatnym atrybutem name (string). Dodaj konstruktor, który przyjmuje nazwę i wyświetla "Creating: <name>", oraz destruktor, który wyświetla "Destroying: <name>". Dodaj metodę getName(), która zwraca nazwę licznika.
  • main.cpp: Zademonstruj alokację zarówno na stosie, jak i na stercie. Wczytaj nazwę z wejścia, a następnie:
    • Utwórz obiekt Counter alokowany na stosie, używając tej nazwy
    • Utwórz obiekt Counter alokowany na stercie o nazwie "HeapCounter"
    • Wyświetl obie nazwy liczników w formacie "Stack: <name>" i "Heap: <name>"
    • Usuń licznik alokowany na stercie, aby zapobiec wyciekowi pamięci

Obserwuj, w jakiej kolejności pojawiają się komunikaty konstruktora i destruktora, zależnie od tego, kiedy tworzysz i usuwasz każdy obiekt. Obiekt na stosie zostanie automatycznie zniszczony po zakończeniu działania main(), natomiast obiekt na stercie trzeba jawnie usunąć.

Dołącz plik nagłówkowy w main.cpp za pomocą #include "Counter.h".

Spróbuj swoich sił

#include <iostream>
#include <string>
#include "Counter.h"

using namespace std;

int main() {
    // Odczytaj nazwę z wejścia
    string inputName;
    cin >> inputName;

    // TODO: Utwórz obiekt Counter na stosie, używając inputName

    // TODO: Utwórz obiekt Counter na stercie o nazwie "HeapCounter"

    // TODO: Wypisz nazwę obiektu Counter ze stosu w formacie "Stack: <name>"

    // TODO: Wypisz nazwę obiektu Counter ze sterty w formacie "Heap: <name>"

    // TODO: Usuń obiekt Counter ze sterty, aby zapobiec wyciekowi pamięci

    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online