free() ile Belleği Serbest Bırakma
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 35 / 63.
malloc() kullanarak belleği dinamik olarak tahsis ettiğinizde, siz onu açıkça serbest bırakana kadar bu bellek tahsis edilmiş olarak kalır. free() fonksiyonu, kullanımınız bittiğinde dinamik olarak tahsis edilmiş belleği sisteme geri döndürmek için aracınızdır.
free() fonksiyonu bir argüman alır: serbest bırakmak istediğiniz bellek bloğuna bir işaretçi (pointer). Bu, malloc() (veya calloc() gibi ilgili fonksiyonlar) tarafından döndürülen işaretçinin aynısı olmalıdır.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Bellek ayır
*ptr = 42; // Belleği kullan
free(ptr); // İşlem bittiğinde belleği serbest bırakfree() fonksiyonunu çağırmamak, bellek sızıntısı (memory leak) olarak bilinen durumu oluşturur. Ayrılan bellek, artık kullanmıyor olsanız bile programınız tarafından rezerve edilmiş olarak kalır. Uzun süre çalışan programlarda veya tekrar tekrar bellek ayıran programlarda, bu sızıntılar tüm kullanılabilir sistem belleğini tüketebilir ve performans sorunlarına veya çökmelere neden olabilir.
Unutmayın: her malloc() fonksiyonunun karşılık gelen bir free() fonksiyonu olmalıdır. Bu eşleştirme, C programlamada sorumlu bellek yönetimi için esastır.
Görev
KolayDinamik bellek tahsisi ve serbest bırakılmasının tam yaşam döngüsünü gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- Kullanıcıdan kaç adet tam sayı saklanacağını temsil eden bir
counttam sayısı okuyun countadet tam sayıdan oluşan bir dizi için dinamik olarak bellek tahsis etmek üzeresizeof()ile birliktemalloc()kullanın- Bellek tahsisinin başarılı olup olmadığını kontrol edin - başarısız olursa,
Memory allocation failed!yazdırın ve programı sonlandırın - Tahsis başarılı olursa,
Memory allocated successfully!yazdırın - Kullanıcıdan
countadet tam sayı değeri okuyun ve bunları tahsis edilen dizide saklayın - Tüm değerlerin toplamını şu formatta hesaplayın ve yazdırın:
Sum: [value] - En büyük değeri şu formatta bulun ve yazdırın:
Maximum: [value] - Belleği serbest bırakmak için
free()kullanın - Temizliği onaylamak için
Memory freed successfully!yazdırın
malloc() ve free() fonksiyonlarını kullanmak için <stdlib.h> başlık dosyasını dahil etmeyi unutmayın. Bu meydan okuma, programlarınızda bellek sızıntılarını önlemek için malloc() ve free() fonksiyonlarının temel eşleşmesini göstermektedir.
Örneğin, giriş şu şekildeyse:
4
15 8 23 12Çıktınız şu şekilde olmalıdır:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Bu meydan okuma, dinamik olarak tahsis edilen her bellek bloğunun artık ihtiyaç duyulmadığında uygun şekilde serbest bırakılması gerektiği şeklindeki kritik kavramı pekiştirerek, C programlamada sorumlu bellek yönetimi döngüsünü tamamlar.
Kopya kağıdı
malloc() ile ayrılan belleği serbest bırakmak için free() kullanın:
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Bellek ayır
*ptr = 42; // Belleği kullan
free(ptr); // İşlem bittiğinde belleği serbest bırakBellek sızıntılarını önlemek için her malloc()'un karşılık gelen bir free()'si olmalıdır. free()'ye geçirilen işaretçi, malloc() tarafından döndürülen işaretçi ile aynı olmalıdır.
Kendin dene
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Saklanacak tam sayı adedini oku
scanf("%d", &count);
// YAPILACAK: Kodunuzu aşağıya yazın
// 1. sizeof() ile malloc() kullanarak bellek ayırın
// 2. Bellek ayırma işleminin başarılı olup olmadığını kontrol edin
// 3. Tam sayı değerlerini okuyun ve saklayın
// 4. Toplamı hesaplayın ve maksimumu bulun
// 5. Ayrılan belleği serbest bırakın
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları6Bellek Yönetimi
Stack ve Heap BellekDinamik Bellek Ayırma - malloc()Bellek Ayırma için sizeof() KullanımıBellek Ayırma Hatasını Kontrol Etmefree() ile Belleği Serbest Bırakmacalloc() ile Bellek AyırmaÖzet: Dinamik Dizi