Zwalnianie pamięci za pomocą free()
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 35 z 63.
Gdy dynamicznie przydzielasz pamięć za pomocą malloc(), pozostaje ona przydzielona, dopóki jej jawnie nie zwolnisz. Funkcja free() służy do zwracania systemowi dynamicznie przydzielonej pamięci, gdy skończysz z niej korzystać.
Funkcja free() przyjmuje jeden argument: wskaźnik do bloku pamięci, który chcesz zwolnić. Musi to być ten sam wskaźnik, który został zwrócony przez malloc() (lub powiązane funkcje, takie jak calloc()).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Przydziel pamięć
*ptr = 42; // Użyj pamięci
free(ptr); // Zwolnij pamięć po zakończeniuNiezwolnienie pamięci przez wywołanie free() powoduje tak zwany wyciek pamięci. Przydzielona pamięć pozostaje zarezerwowana przez program, mimo że już jej nie używasz. W długo działających programach lub programach wielokrotnie przydzielających pamięć takie wycieki mogą pochłonąć całą dostępną pamięć systemową i powodować problemy z wydajnością lub awarie.
Pamiętaj: każdemu malloc() powinno odpowiadać free(). Ta para jest niezbędna do odpowiedzialnego zarządzania pamięcią w programowaniu w C.
Wyzwanie
ŁatwyNapisz program w C, który demonstruje pełny cykl przydzielania i zwalniania pamięci dynamicznej. Twój program powinien:
- Odczytać od użytkownika liczbę całkowitą
count, określającą, ile liczb całkowitych ma zostać zapisanych - Użyć
malloc()wraz zsizeof(), aby dynamicznie przydzielić pamięć na tablicęcountliczb całkowitych - Sprawdzić, czy przydzielenie pamięci się powiodło — jeśli nie, wyświetlić
Memory allocation failed!i zakończyć program - Jeśli przydzielenie pamięci się powiedzie, wyświetlić
Memory allocated successfully! - Odczytać od użytkownika
countliczb całkowitych i zapisać je w przydzielonej tablicy - Obliczyć i wyświetlić sumę wszystkich wartości w formacie:
Sum: [value] - Znaleźć i wyświetlić największą wartość w formacie:
Maximum: [value] - Użyć
free(), aby zwolnić pamięć - Wyświetlić
Memory freed successfully!, aby potwierdzić zwolnienie pamięci
Pamiętaj, aby dołączyć nagłówek <stdlib.h>, żeby móc używać malloc() i free(). To wyzwanie pokazuje, jak ważne jest używanie malloc() i free() w parze, aby zapobiegać wyciekom pamięci w programach.
Na przykład, jeśli dane wejściowe to:
4
15 8 23 12Oczekiwane dane wyjściowe to:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!To wyzwanie utrwala kluczową zasadę: każdy dynamicznie przydzielony blok pamięci należy prawidłowo zwolnić, gdy nie jest już potrzebny. W ten sposób w programowaniu w C zamyka się pełny cykl odpowiedzialnego zarządzania pamięcią.
Spróbuj swoich sił
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Wczytaj liczbę liczb całkowitych do przechowania
scanf("%d", &count);
// TODO: Napisz swój kod poniżej
// 1. Przydziel pamięć za pomocą malloc() i sizeof()
// 2. Sprawdź, czy przydział pamięci się powiódł
// 3. Wczytaj wartości całkowite i je zapisz
// 4. Oblicz sumę i znajdź wartość maksymalną
// 5. Zwolnij przydzieloną pamięć
return 0;
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i sterowanie przepływem
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znaków6Zarządzanie pamięcią
Pamięć stosu a stertyAlokacja dynamiczna — malloc()Użycie sizeof() do alokacjiSprawdzanie niepowodzenia alokacjiZwalnianie pamięci za pomocą free()Alokacja za pomocą calloc()Podsumowanie: tablica dynamicznaPoćwicz samodzielnie: Kompilator C online