wleci
O mnieProjektyBlogKontakt
Kontakt
Wróć do bloga
C++PamięćTutorialFeatured

Dynamiczna Alokacja Pamięci w C++: Jak budować i burzyć w RAMie

Zrozum operator new i delete. Wyjaśniamy różnicę między stosem a stertą, jak zarządzać pamięcią i unikać wycieków pamięci.

4 lutego 20264 min czytania
Udostępnij:

Dynamiczna Alokacja Pamięci: Twoja Własna Firma Budowlana w C++

Witaj w jednej z najważniejszych lekcji programowania. Do tej pory, gdy tworzyłeś zmienną typu int x = 5;, C++ sam zajmował się wszystkim. Rezerwował miejsce, wkładał tam liczbę i sprzątał, gdy funkcja się kończyła. To nazywamy automatycznym zarządzaniem pamięcią na tzw. Stosie (Stack).

Ale co, jeśli nie wiesz, jak dużo miejsca będziesz potrzebować, zanim uruchomisz program? Co, jeśli chcesz, aby dane przetrwały dłużej niż funkcja, w której powstały? Tu wchodzi Dynamiczna Alokacja Pamięci na Stercie (Heap).


1. Stos vs. Sterta – Gdzie mieszkają Twoje dane?

Wyobraź sobie dwa rodzaje magazynów:

  1. Stos (Stack): To jak stos talerzy. Jest bardzo uporządkowany, szybki, ale ma ograniczony rozmiar. Gdy funkcja się kończy, C++ po prostu „zdejmuje” ostatnie talerze i wyrzuca je do kosza. Wszystko dzieje się automatycznie.
  2. Sterta (Heap): To wielki, otwarty plac budowy. Możesz tam zamówić dowolnie duży obszar pamięci w dowolnym momencie. Ale jest jeden haczyk: to Ty jesteś kierownikiem budowy. Jeśli coś tam zbudujesz, musisz to sam zburzyć. Jeśli o tym zapomnisz, plac budowy w końcu się zapełni i zabraknie miejsca dla innych.

2. Operator new – Zamawianie działki

Kiedy chcesz stworzyć coś na stercie, używasz słowa kluczowego new. Operator ten robi dwie rzeczy:

  1. Znajduje wolne miejsce w pamięci (na stercie).
  2. Zwraca adres (wskaźnik) do tego miejsca.

Przykład:

cpp
int* p = new int; // Rezerwujemy miejsce na jedną liczbę int na stercie *p = 100; // Wkładamy tam wartość 100

Zauważ, że p to zwykły wskaźnik, który mieszka na stosie, ale to, na co on „pokazuje”, znajduje się na dalekiej stercie.


3. Operator delete – Sprzątanie po imprezie

To jest moment, w którym większość programistów oblewa test. Każda pamięć zarezerwowana przez new musi zostać zwolniona przez delete. Jeśli tego nie zrobisz, powstaje wyciek pamięci (Memory Leak).

cpp
delete p; // Zwalniamy pamięć pod adresem p p = nullptr; // Dobra praktyka: zerujemy wskaźnik, żeby nie użyć go przez przypadek

Zasada Złotego Sprzątacza: Na każdy jeden new musi przypadać dokładnie jeden delete.


4. Tablice dynamiczne: new[] oraz delete[]

Czasem nie potrzebujesz jednego int, ale całej tablicy, której rozmiar podaje użytkownik w trakcie działania programu.

cpp
int rozmiar; std::cin >> rozmiar; int* tablica = new int[rozmiar]; // Alokacja tablicy // Używamy jak zwykłej tablicy tablica[0] = 10; // UWAGA: Przy zwalnianiu tablicy musimy użyć delete z nawiasami! delete[] tablica;

Jeśli użyjesz zwykłego delete zamiast delete[] dla tablicy, zwolnisz tylko pierwszy element, a reszta zostanie w pamięci na zawsze jako „duch”.


5. Najczęstsze błędy (Jak nie doprowadzić do katastrofy)

A. Wycieki Pamięci (Memory Leaks)

Zdarzają się, gdy gubisz wskaźnik do pamięci, której nie zwolniłeś.

cpp
void funkcja() { int* dane = new int[1000]; // ... robimy coś ... // Zapomnieliśmy o delete[] dane! } // Funkcja się kończy, wskaźnik 'dane' znika, ale 1000 intów wciąż siedzi w RAMie.

B. Wiszące Wskaźniki (Dangling Pointers)

To sytuacja, gdy używasz wskaźnika po tym, jak już zwolniłeś pamięć.

cpp
int* p = new int(5); delete p; std::cout << *p; // BŁĄD! Pukamy do drzwi domu, który został zburzony.

C. Podwójne zwalnianie (Double Free)

Próba wykonania delete na tym samym adresie dwa razy. Zazwyczaj kończy się natychmiastowym zamknięciem programu (Crash).


6. Współczesny C++ (Smart Pointers) – Zapomnij o delete?

Małpka powinna wiedzieć, że w nowoczesnym C++ (od standardu C++11) rzadko używa się new i delete ręcznie. Mamy do tego Inteligentne Wskaźniki (Smart Pointers), takie jak std::unique_ptr czy std::shared_ptr, które same robią delete, gdy nie są już potrzebne.

Jednak zrozumienie ręcznej alokacji jest kluczowe, aby wiedzieć, co te inteligentne narzędzia robią pod maską.


Podsumowanie dla Małpki krok po kroku:

  1. Potrzebujesz miejsca na placu budowy (Sterta)? Użyj new.
  2. Dostałeś adres (Wskaźnik)? Zapisz go, bo bez niego nie trafisz do swoich danych.
  3. Skończyłeś pracę? Musisz zburzyć budynek używając delete (lub delete[] dla tablic).
  4. Zgubiłeś kartkę z adresem przed zburzeniem? Masz wyciek pamięci. Twoja RAM „puchnie”.
  5. Burzysz dwa razy? Program wybuchnie.

Czy chcesz teraz dowiedzieć się, jak tworzyć własne „typy danych”, czyli przejść do świata Klas i Obiektów?

Może Cię zainteresować

ReferencjeC++

Etap 5: Referencje i referencje jako parametry funkcji

Zrozumienie mechanizmu referencji w C++: jak działają aliasy zmiennych i dlaczego są kluczowe w wydajnym przekazywaniu argumentów.

3 min czytania
C++Programowanie

Konwersja liczb i napisów w C++: Dogłębna analiza sprintf oraz strtof

Kompleksowy przewodnik po klasycznych metodach konwersji typów w C++. Dowiedz się, jak bezpiecznie używać sprintf i strtof oraz poznaj ich nowoczesne alternatywy.

3 min czytania
C++Tutorial

Referencje w C++: Poznaj „Ksywki” Twoich Zmiennych

Zrozum referencje raz a dobrze. Czym różnią się od wskaźników? Jak używać operatora & w deklaracjach? Przewodnik krok po kroku.

4 min czytania
Wróć do bloga
wleci.pl

Full-stack Developer

Tworzę nowoczesne aplikacje webowe z pasją do czystego kodu i dobrego designu.

[email protected]
Polska

Nawigacja

  • Start
  • O mnie
  • Projekty
  • Blog
  • Kontakt

Usługi

  • Aplikacje webowe
  • Strony internetowe
  • API & Backend
  • Konsultacje

Technologie

  • React / Next.js
  • TypeScript
  • Node.js
  • PostgreSQL

Social

© 2026 wleci.pl. Wszelkie prawa zastrzeżone.

Polityka prywatności•Regulamin

Zrobione z w Polsce