Değişkenlerin hafızaya alınabileceği iki yer vardır. Bunun gibi bir değişken oluşturduğunuzda:
int a;
char c;
char d[16];
Değişkenler " yığın " içinde oluşturulur . Yığın değişkenleri, kapsam dışına çıktıklarında (yani, kod artık onlara ulaşamadığında) otomatik olarak serbest bırakılır. Bunların "otomatik" değişkenler olarak adlandırıldığını duyabilirsiniz, ancak bu modası geçmiştir.
Birçok başlangıç örneği yalnızca yığın değişkenlerini kullanır.
Yığın iyidir çünkü otomatiktir, ancak aynı zamanda iki dezavantajı vardır: (1) Derleyicinin değişkenlerin ne kadar büyük olduğunu önceden bilmesi gerekir ve (b) yığın alanı biraz sınırlıdır. Örneğin: Windows'ta, Microsoft bağlayıcı için varsayılan ayarlar altında, yığın 1 MB olarak ayarlanmıştır ve değişkenleriniz için tümü kullanılamaz.
Derleme zamanında dizinizin ne kadar büyük olduğunu bilmiyorsanız veya büyük bir diziye veya yapıya ihtiyacınız varsa, "B planına" ihtiyacınız vardır.
Plan B, " yığın " olarak adlandırılır . Genellikle İşletim Sisteminin izin verdiği büyüklükte değişkenler oluşturabilirsiniz, ancak bunu kendiniz yapmanız gerekir. Daha önceki gönderiler size bunu yapmanın bir yolunu gösterdi, ancak başka yollar da var:
int size;
char *p = (char *)malloc(size);
(Yığındaki değişkenlerin doğrudan değil, işaretçiler aracılığıyla değiştirildiğini unutmayın)
Bir yığın değişkeni oluşturduğunuzda, sorun, derleyicinin onunla işiniz bittiğini söyleyememesi, bu nedenle otomatik yayınlamayı kaybedersiniz. İşte burada bahsettiğiniz "manuel serbest bırakma" devreye girer. Kodunuz artık değişkene ne zaman ihtiyaç duyulmayacağına karar vermekten ve onu serbest bırakmaktan sorumludur, böylece bellek başka amaçlar için alınabilir. Yukarıdaki durum için:
free(p);
Bu ikinci seçeneği "iğrenç iş" yapan şey, değişkene artık ne zaman ihtiyaç duyulmadığını bilmenin her zaman kolay olmamasıdır. İhtiyacınız olmadığında bir değişkeni serbest bırakmayı unutmak, programınızın ihtiyaç duyduğu bellek miktarından daha fazlasını tüketmesine neden olur. Bu duruma "sızıntı" denir. "Sızan" bellek, programınız sona erene ve işletim sistemi tüm kaynaklarını kurtarana kadar hiçbir şey için kullanılamaz. Aslında onunla işiniz bitmeden bir yığın değişkenini yanlışlıkla serbest bırakırsanız daha kötü sorunlar bile mümkündür .
C ve C ++ 'da, yukarıda gösterildiği gibi yığın değişkenlerinizi temizlemekten sorumlusunuz. Ancak, Java ve .NET gibi C # gibi farklı bir yaklaşım kullanan ve yığının kendi kendine temizlendiği diller ve ortamlar vardır. "Çöp toplama" olarak adlandırılan bu ikinci yöntem, geliştirici için çok daha kolaydır, ancak ek yük ve performansta bir ceza ödersiniz. Bu bir denge.
(Daha basit ama umarım daha seviyeli bir cevap vermek için birçok detayı gözden geçirdim)