Konu tarihçesi:
Dinamik bellek ayırma mekanizmaları, C dilinde <stdlib.h> kütüphanesindeki malloc/free fonksiyonlarıyla birlikte ortaya çıktı. Bu, değişken boyutlu yapılar, karmaşık koleksiyonlar ve nesneler gerçekleştirilmesine olanak tanıyarak, dilin ve büyük programlamadaki uygulamalarının gelişiminde güçlü bir itici güç sağladı.
Sorun:
Dinamik bellek ile çalışma, programcıdan nesnelerin yaşam döngüsü üzerinde tam kontrol sağlamasını gerektirir. Hatalar (bellek sızıntıları, çift serbest bırakma, işaretçilerin yanlış kullanılması) çökmelere veya zafiyetlere (örneğin, use-after-free hatasıyla istismarlar) neden olabilir.
Çözüm:
— Her zaman malloc/calloc/realloc tarafından döndürülen değerleri kontrol edin. Eğer bellek ayırma başarısız olduysa — NULL dönerler. — Belleği serbest bırakırken, serbest bırakılmış bloğun kullanılmasını önlemek için işaretçiyi NULL’a yönlendirin. — free çağrısından sonra işaretçiyi kullanmayın. — malloc/free ve calloc/free arasında doğru eşleşmeyi koruyun.
Örnek kod:
#include <stdio.h> #include <stdlib.h> int main() { int *arr = malloc(5 * sizeof(int)); if (!arr) { perror("Bellek ayırma başarısız oldu"); return 1; } for (int i = 0; i < 5; ++i) arr[i] = i * i; for (int i = 0; i < 5; ++i) printf("%d ", arr[i]); printf(" "); free(arr); arr = NULL; return 0; }
Anahtar özellikler:
malloc ile ayrılan belleği delete operatörü ile serbest bırakınca ya da tam tersine (C++) ne olur?
Bellek ayırma ve serbest bırakma mekanizmaları diller arasında (C/C++) karıştırılmamalıdır. C’de sadece malloc/free, C++’da new/delete kullanılır.
free(NULL) çağrısı yapıldığında ne olur?
free(NULL) — güvenlidir (bu, C standartları tarafından garanti edilir). Bu çağrı hiçbir şey yapmaz.
realloc kullanarak bellek bloğunu artırmak veya azaltmak mümkün müdür ve mevcut işaretçi ile ne olur?
realloc bellek bloğunu taşıyabilir ve bu gerçekleşirse, eski işaretçi geçersiz hale gelir. Her zaman yeni bir işaretçiye atama yapın:
ptr = realloc(ptr, new_size);
Döngüde bir dizi için bellek ayırdık ama her iterasyondan sonra serbest bırakmayı unuttuk. Gece boyunca sunucuda program tüm RAM’i tüketti.
Artılar:
Eksiler:
Döngüde bellek her zaman kullanımdan sonra serbest bırakıldı, tüm NULL kontrolleri malloc'tan hemen sonra yapıldı, sızıntıları kontrol etmek için hata ayıklama araçları kullanıldı.
Artılar:
Eksiler: