C pointer malloc

Başlatan Larkin, 01 Mayıs 2013, 16:06:03

Larkin

merhaba C derleyicisinde bir fonksiyon içerisinde şöyle bir pointer için tanimlama yaptim

(
int *ptr;
ptr = malloc(1000 * sizeof (*ptr));
)

sorum şu : fonksiyonu her çağrışımımdan sonra malloc ile ayirdiğim kısmı free(); yapmak zorundamıyım
free yaptıktan sonra fonksiyonu tekrar çağırırsam sorun olur mu null değer döndürmek gibi

yada ayırdığım bellek kısmını free yapmadan tekrar kullanırsam yani fonksiyonun bitiminde bu kumeleri geriyede dönerek(pointeri dizi gibi kullanıyorum ) 0 la doldurup fonksiyonu tekrar çalıştırdığımda sıkıntı çıkarır mı yani İşletim sistemi bana şunu dermi : Arkadaş sabahtan beri ram da cirit atıyon bura bana lazım defol git artık der mi yoksa free() ile serbest bırakana kadar bu ram bölgesi bana mı aittir.
Not: ram 1mb olduğundan bu kadar sıkıntılıyım.

İlgilenenlere teşekkür ederim.

Tagli

Şu haliyle, ptr yerel bir değişken olduğu için, fonksiyon sonlandığında malloc ile ayırdığın alanın ucunu kaçırırsın, yani sızıntı olur (memory leak). İşin bittikten sonra fonksiyondan çıkmadan bu alanı free ile sisteme geri vermen gerekir. Tabi ptr'yi fonksiyon dışına döndürüp bu alanı dışarıda kullanacaksan iş değişir, bunu bilemem. Ancak sadece yerel olarak kullanacağın bir alanda hafızayı malloc ile almana gerek olmayabilir.

Alanı free ile serbest bıraktıktan sonra, eğer ptr'yi fonksiyon dışında kullanmıyorsan sorun olmaz. Fonksiyon tekrar tekrar çağrılabilir.

Alanı free yapmadan tekrar kullanamazsız. Fonksiyona tekrar girildiğinde ptr yeniden tanımlanacak ve malloc ile bir başka alan alınacaktır. Eskisinin üstüne almaz yani. Yukarıda da bahsettiğim gibi, şu durumda fonksiyon sonlandığında sızıntı zaten oluşmuş demektir.
Gökçe Tağlıoğlu

Larkin

#2
zaten ptr fonksiyon dışında çalışıyor, ikinci bir ptr tanımlayıp 1. ptr yi 2. ptr ye atayıp fonksiyon dışında çalıştırıyorum. Fonksiyon sadece gövde görevi yapıyor ne gerek var deme zorunluyum.

aslinda öğrenmek istediğim tanımladığım bir ptr için ayırdığım alanı, ptr isterse boşta dursun; işletim sistemi rutin çalışırken hiç ihtiyacı yokken almak istermi?

Tagli

Malloc ile alınmış bir alanı sen free ile serbest bırakmadıkça işletim sistemi o alanı geri alamaz. Tabi process'in sonlanması durumu hariç.

Çöp toplayıcı barındıran dillerde, referansı kalmayan alanlar (çöpler) toplanarak işletim sistemine geri verilebilir. Normalde C++'da çöp toplayıcı yok, ama sanki dışarıdan eklenebiliyordu gibi okumuştum bir yerlerde.
Gökçe Tağlıoğlu