Menu
Coddy logo textTech

Wycieki pamięci

Lekcja 12 z 14 w kursie Wskaźniki w C++ w Coddy.

W poprzedniej lekcji użyliśmy słowa kluczowego delete, ponieważ bardzo ważne jest zwalnianie przydzielonej pamięci. Teraz dowiemy się o tym więcej.

Wyciek pamięci występuje, gdy program przydziela pamięć ze sterty, ale nie zwalnia jej, gdy przestaje być potrzebna.

Zasadniczo, kiedy uruchamiamy program, przydzielamy potrzebną pamięć, a później o niej zapominamy i ta pamięć nigdy nie zostaje zwolniona/usunięta. Spójrz na poniższy przykład:

int *p, *q; // Deklaracja
p = new int; // Alokowanie pamięci
q = new int; // Alokowanie pamięci

*p = 10; // Przypisanie wartości
*q = 20; // Przypisanie wartości

cout << *p << " " << *q << endl;
q = p; // q i p wskazują na to samo miejsce w pamięci
// Początkowy adres wskazywany przez q zostaje UTRACONY
cout << *p << " " << *q << endl;

delete p;
delete q;
Output:
10 20
10 10

Najpierw deklarujemy wskaźniki, przydzielamy pamięć dla każdej z liczb całkowitych, a następnie ustawiamy wartości pod tymi adresami. Jak widać, możemy je wyświetlić za pomocą pierwszego cout. 


Interesująca rzecz dzieje się w wierszu <i>q = p</i>: ustawiamy wskaźnik <i>q</i>, aby wskazywał to samo miejsce co <i>p</i>. W ten sposób pierwotne miejsce przydzielone dla wskaźnika <i>q</i> zostaje trwale utracone i nie można już uzyskać do niego dostępu ani go usunąć.


Jak widać w następnym wierszu, ponownie wyświetlamy wyłuskiwane wskaźniki i otrzymujemy takie same wartości, ponieważ wskazują to samo miejsce

Dlatego tak ważne jest, aby przejmować się wyciekami pamięci i zarządzać dynamicznie przydzielanymi danymi.

quiz iconSprawdź się

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

quiz iconSprawdź się

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

quiz iconSprawdź się

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

challenge icon

Wyzwanie

Łatwy

Napisz ten sam program co na poprzedniej lekcji, ale tym razem zwolnij całą przydzieloną pamięć za pomocą słowa kluczowego delete. Dynamicznie przydziel pamięć dla trzech liczb całkowitych za pomocą wskaźników ptrA, ptrB i ptrC. Użyj trzech liczb całkowitych przekazanych jako argumenty funkcji i ustaw wartości pod adresami wskaźników tak, aby odpowiadały tym liczbom. Pierwszą liczbę przypisz do ptrA, drugą do ptrB, a ostatnią do ptrC, a na koniec wypisz wszystkie wskaźniki po dereferencji, oddzielone spacją.

Nie pisz funkcji <i>main()</i>

Spróbuj swoich sił

#include <iostream>

using namespace std;

void dynamicMemory(int a, int b, int c) {
    // Wpisz tutaj swój kod
    
    // Zwolnij pamięć
}

// NIE pisz funkcji main()

Wszystkie lekcje w sekcji Wskaźniki w C++

Poćwicz samodzielnie: Kompilator C++ online