free() ile Belleği Serbest Bırakma
Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 35 / 63.
malloc() kullanarak belleği dinamik olarak ayırdığınızda, siz açıkça serbest bırakana kadar bu bellek ayrılmış olarak kalır. free() işlevi, kullanmayı tamamladığınızda dinamik olarak ayrılmış belleği sisteme geri vermek için kullandığınız araçtır.
free() işlevi tek bir bağımsız değişken alır: serbest bırakmak istediğiniz bellek bloğuna işaret eden bir işaretçi. Bu, malloc() (veya calloc() gibi ilgili işlevler) 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); // İşin bitince belleği serbest bırakfree() işlevini çağırmamak, bellek sızıntısı olarak bilinen duruma yol açar. Ayrılan bellek, artık onu kullanmıyor olsanız bile programınız tarafından rezerve edilmiş olarak kalır. Uzun süre çalışan programlarda veya belleği tekrar tekrar ayıran programlarda bu sızıntılar, kullanılabilir sistem belleğinin tamamını tüketebilir ve performans sorunlarına veya çökmelere neden olabilir.
Unutma: her malloc() çağrısının karşılık gelen bir free() çağrısı olmalıdır. Bu eşleştirme, C programlamasında sorumlu bellek yönetimi için gereklidir.
Görev
KolayDinamik bellek ayırma ve serbest bırakmanın tamamlanmış yaşam döngüsünü gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- Kullanıcıdan, kaç tamsayı depolanacağını belirten bir
counttamsayısı okuyun malloc()tamsayıdan oluşan bir dizi için dinamik olarak bellek ayırmak üzeresizeof()ile birliktecountkullanın- Bellek ayırma işleminin başarılı olup olmadığını kontrol edin - başarısız olursa
Memory allocation failed!yazdırın ve programı sonlandırın - Ayırma başarılı olursa
Memory allocated successfully!yazdırın - Kullanıcıdan
countadet tamsayı değeri okuyun ve bunları ayrılan diziye kaydedin - Tüm değerlerin toplamını hesaplayın ve şu biçimde yazdırın:
Sum: [value] - En büyük değeri bulun ve şu biçimde yazdırın:
Maximum: [value] - Belleği serbest bırakmak için
free()kullanın - Temizleme işlemini doğrulamak için
Memory freed successfully!yazdırın
<stdlib.h> ve malloc() kullanmak için free() başlığını eklemeyi unutmayın. Bu alıştırma, programlarınızda bellek sızıntılarını önlemek için malloc() ve free() işlevlerinin birlikte kullanılmasının gerekliliğini gösterir.
Örneğin, girdi şuysa:
4
15 8 23 12Çıktınız şu olmalıdır:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Bu alıştırma, artık ihtiyaç duyulmayan her dinamik olarak ayrılmış bellek bloğunun uygun şekilde serbest bırakılması gerektiği yönündeki kritik kavramı pekiştirir ve C programlamada sorumlu bellek yönetimi döngüsünü tamamlar.
Kendin dene
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Saklanacak tamsayıların sayısını oku
scanf("%d", &count);
// TODO: Kodunuzu aşağıya yazın
// 1. malloc() ile sizeof() kullanarak bellek ayırın
// 2. Ayırmanın başarılı olup olmadığını kontrol edin
// 3. Tamsayı 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.
Mantık & Akış 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 DiziKendi başına pratik yap: Online C derleyicisi