Kullanmanız gereken belleğin tam boyutunu bilmiyorsanız, dinamik ayırmaya ( malloc
) ihtiyacınız vardır . Bir örnek, bir kullanıcının uygulamanızda bir dosya açması olabilir. Dosyanın içeriğini belleğe okumanız gerekecek, ancak kullanıcı dosyayı çalışma zamanında yerinde seçtiği için tabii ki dosyanın boyutunu önceden bilmiyorsunuz. Dolayısıyla, temel malloc
olarak önceden üzerinde çalıştığınız verilerin boyutunu bilmediğinizde ihtiyacınız var . En azından kullanmanın ana nedenlerinden biri bu malloc
. Derleme zamanında boyutunu zaten bildiğiniz (ayrıca onu değiştirmek istemediğiniz) basit bir dizeye sahip örneğinizde, bunu dinamik olarak ayırmanın pek bir anlamı yoktur.
Biraz konu dışı, ama ... kullanırken hafıza sızıntısı yaratmamak için çok dikkatli olmalısın malloc
. Bu kodu düşünün:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
if ( ) return -1;
free(someMemory);
return result;
}
Bu kodda neyin yanlış olduğunu görüyor musunuz? Arasında bir koşullu Dönüş ifadesi var malloc
ve free
. İlk başta iyi görünebilir ama bir düşünün. Bir hata varsa, ayırdığınız belleği boşaltmadan geri döneceksiniz. Bu, bellek sızıntılarının yaygın bir kaynağıdır.
Elbette bu çok basit bir örnek ve burada hatayı görmek çok kolay, ancak işaretçiler, malloc
s, free
s ve her türlü hata işlemeyle dolu yüzlerce satır kod hayal edin . İşler gerçekten çok hızlı bir şekilde dağınık hale gelebilir. Bu, uygulanabilir durumlarda modern C ++ 'yı C'ye tercih etmemin nedenlerinden biri, ancak bu tamamen başka bir konu.
Bu yüzden ne zaman kullanırsanız kullanın malloc
, hafızanızın olabildiğince büyük olacağından emin olun free
.
malloc()
başarısız olabileceğinin farkında değiller !