From: M.Atif CEYLAN (atifceylan@gmail.com)
Date: Fri 27 Apr 2007 - 20:38:46 EEST
Caglar Akyuz yazmış:
> M.Atif CEYLAN wrote:
>
>> Caglar Akyuz yazmış:
>>
>>> M.Atif CEYLAN yazmış:
>>>
>>>
>>>> Ustun ERGENOGLU yazmış:
>>>>
>>>>
>>>>> malloc ile aldığınız bellek alanları fonksiyondan çıktığınızda
>>>>> boşalmaz, mutlaka free ile bırakmanız gerekir. sadece fonksiyonda
>>>>> kullanılacak yerel değişkenler fonksiyona girince stack'den yer alıp
>>>>> kullanır, çıkınca da bırakılır, ama malloc stack'den değil heap'den
>>>>> yer alır ve program çalıştığı sürece kalır.
>>>>>
>>>>> 26.04.2007 tarihinde M.Atif CEYLAN <atifceylan@gmail.com> yazmış:
>>>>>
>>>>>
>>>>>
>>>>>> herkese merhaba,
>>>>>> arkadaşlar C de yazdığım bir programda cok yoğun string işlemleri
>>>>>> kullanıyorum (10 larca mb lık dosyaları okuyup parse etmeye calışıyorum
>>>>>> ve bu işlemi periyodik olarak devamlı olarak yapıyorum). ancak
>>>>>> stringleri küçük parçalarda alıp her seferinde fonksiyona sokuyorum
>>>>>> mesela :
>>>>>>
>>>>>> while (sart)
>>>>>> islemyap(str)//burada en fazla 2 KB datam var
>>>>>>
>>>>>> islemyap(char *str)
>>>>>> char *a = (char*)malloc(256);
>>>>>> char *b = (char*)malloc(25);
>>>>>>
>>>>>> a = str_temizle(sub_str(str,3,255));
>>>>>> b = str_temizle(sub_str(str,258,24));
>>>>>> ........................
>>>>>>
>>>>>> şeklinde devam eden islemyap benzeri 4 fonksiyonum var.
>>>>>> sorunum şu. fonksiyon sona erdiğinde ayrılan bellek alanları zaten
>>>>>> boşalır düşüncesi ile değişkenlerimi free etmiyorum.
>>>>>> ancak top cıktısı bir facia gibi adeta. her seferinde yükselen bir
>>>>>> bellek var önümde. bu durum, çekirdeğin ihtiyat için benim programın
>>>>>> ayırdığı bellek alanlarını tutması ile alakalı olabilir mi? yoksa
>>>>>> fonksiyonların sonunda free etsem mi? ama o kadar fazla değişkenim var
>>>>>> ki gözüm yemiyor daha kötüsü bazıları şartlara göre set edildiği için
>>>>>> free işlemlerinde de kontrole ihtiyac duyacağım.fikirlerinizi bekliyorum
>>>>>> iyi çalışmalar...
>>>>>> M.Atıf CEYLAN
>>>>>>
>>>>>> _______________________________________________
>>>>>> Linux-programlama mailing list
>>>>>> Linux-programlama@liste.linux.org.tr
>>>>>> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>> _______________________________________________
>>>>> Linux-programlama mailing list
>>>>> Linux-programlama@liste.linux.org.tr
>>>>> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>>>>>
>>>>>
>>>>>
>>>>>
>>>> şöyle bir foksiyonum var.
>>>>
>>>>
>>>> char *fonksiyon(char *str)
>>>> {
>>>> char *Cikacak = (char *malloc(strlen(str)+1);
>>>>
>>>> int i=0,j=0;
>>>>
>>>> for(i=0;i<strlen(str);i++)
>>>> if (sart)
>>>> Cikacak[j++] = str[i];
>>>>
>>>> return Cikacak;
>>>> }
>>>>
>>>>
>>> malloc her zaman başarılı olmaz. Döndürdüğü değeri mutlaka NULL mı değil
>>> mi diye kontrol etmek gerekir.
>>>
>>>
>>>
>>>> mallocladığım alanı nasıl free edebilirim ve tuttuğu alanı free
>>>> edebilmek için bu foksiyonu daha mantıklı nasıl yazabilirim.
>>>>
>>>>
>>> Bence bu fonksiyon'da bir değişikliğe gerek yok. return ettiğiniz
>>> "Cikacak" pointer'ını her zaman free'ye geçebilirsiniz.
>>>
>>>
>>>
>>>> iyi Çalışmalar...
>>>>
>>>> _______________________________________________
>>>> Linux-programlama mailing list
>>>> Linux-programlama@liste.linux.org.tr
>>>> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>>>>
>>>>
>>>>
>>>>
>>>>
>>> _______________________________________________
>>> Linux-programlama mailing list
>>> Linux-programlama@liste.linux.org.tr
>>> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>>>
>>>
>>>
>> char *deneme(char *a)
>> {
>> char *b = (char *)malloc(20);
>>
>> if (b == NULL)
>> return null;
>>
>> b = a;
>>
>
> Oops! malloc ile ayırdığımız hafızayı çöpe attık :)
>
>>
>> printf("b :%p\t",b);
>>
>> return b;
>> }
>>
>> int main(){
>> char *c = (char *)malloc(20);
>>
>> c = deneme("deneme");
>>
>
> deneme içinde zaten memory i ayırdınız. Bu şekilde iki kere memory
> ayırmış oluyorsunuz ki ikinci satırda da ilk yaptığınızın adresini yok
> kaybediyorsunuz.
>
> Sanırım buradaki ilk satır gereksiz.
>
>
>>
>> printf("c :%p\n",c);
>>
>> free(c);
>>
>> }
>>
>> deneme fonksiyonunun işaret ettiği adresi c pointına geçtim tamam ama
>> benim kafama asıl takılan
>> free(c) yazdığımda
>>
>> 1: deneme fonksiyonundaki b point adreside mi özgür bırakılacak?
>>
>
> Hayır. O adres b = a; işlemi ile unutuldu.
>
>
>> 2: ben free(c) etmeme rağmen b pointı halen aynı adresini koruyor,
>>
>
> Evet çünkü free ettiğiniz hafıza geçersiz. Bu durumda programın
> çalışmaya devam etmesi bile yeterince güzel.
>
>
>> demekki free(c) ile b free olmuyor diye düşündüm ama ne kadar doğru
>> bilemiyorum.
>> 3: programı kapatıp açmama rağmen her seferinde aynı adresi göstermeleri
>> normal mi?
>>
>
> Normal.
>
>
>> 4: eğer free(c) yazdığımda b free olmuyorsa fonksiyondan ayırdığım belek
>> alanını fnksiyondan cıktıktan sonra nasıl free edebilirim?
>>
>
> Tam olarak yapmak istediğinizi anlamadım. Galiba bu tarz birşey
> kullacaksınız.
>
> int main()
> {
> char *str = deneme("0123456789\0");
>
> printf("%d\n", strlen(str));
> printf("%s\n", str);
>
> /* Artık işimiz bitti. Free edebiliriz. Free ile boşaltıcağımız
> * memory daha önce mutlaka malloc( ya da arkadaşları) tarafından
> * ayrılmış olmalı
> */
> free(str);
>
> return 0;
>
> }
>
> char* deneme(char *str)
> {
> /* Bize geçilen adresin içinde oynamak istediğimiz karakter katarı olsun.
> * str'in sonunda NULL karater olduğunu varsayalım
> */
>
> /* Diyelim ki karakter katarını dört kere tekrar etmek istiyoruz.
> Karakterin
> * sonuna NULL karakter koymak için fazladan bir tane yer daha lazım
> */
> char *ptr = (char *)malloc(strlen(str) * 4 + 1);
>
> if( ptr == NULL)
> return NULL;
>
> strncpy(ptr, str, strlen(str));
> strncpy(ptr + strlen(str), str, strlen(str));
> strncpy(ptr + 2 * strlen(str), str, strlen(str));
> strcpy(ptr + 3 * strlen(str), str);
>
> return ptr;
> }
>
> Saygılarımla
> Yusuf Caglar Akyuz
> _______________________________________________
> Linux-programlama mailing list
> Linux-programlama@liste.linux.org.tr
> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>
>
tamam düzelteyim ve biraz daha açayım,
char *deneme(char *a)
{
char *b = (char *)malloc(20);
int i;
for(i = 0;i<strlen(a);i++)
b[i] = a[i];
printf("b :%p\t",b);
return b;
}
bir önceki örnek ölyesine idi,b=a olmıyacak elbetteki.
ama benim asıl sorunum deneme fonksiyonunu ben cok sık cağırıyorum ve
çağırdığım fonksyionlar ayrı ayrı. benim programım çalışmağa başladığı
zaman devamlı bir ram artışı söz konusu oluyor.
yerel değişkenleri veya aynı fonksiyon içindeki dinamik alanları
boşaltınca sorun yok ama bir fonksiyondan bir diğerini çağırıp
çağırdığım fonksiyondaki malloc neticesi heapten ayrılan alan devamlı
olarak artıyor ve belli bir süre sonra allocate edemiyor. yani kısaca
bir fonksiyondan ayırdığım dinamik belleğin
başka fonksiyondan free edilmesi.
iyi çalışmalar...
_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama