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 10Najpierw 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.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wyzwanie
ŁatwyNapisz 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++
2Wskaźniki i referencje
Wskaźniki jako parametryReferencje - &Referencje jako parametryWskaźniki a referencje3Dynamiczna alokacja pamięci
Operatory new i deleteWycieki pamięciTablica dynamicznaTablica dynamiczna — wstawianiePoćwicz samodzielnie: Kompilator C++ online