2012-08-01 15 views
10

bir işlev döndürecek:Ücretsiz ayrılan bellek önce bir işlevi <em>malloc</em> kullanarak bir dizi dönmek için çalışıyorum

char* queueBulkDequeue(queueADT queue, unsigned int size) 
{ 
    unsigned int i; 
    char* pElements=(char*)malloc(size * sizeof(char)); 
    for (i=0; i<size; i++) 
    { 
     *(pElements+i) = queueDequeue(queue); 
    } 
    return pElements; 
} 

sorun benim MCU yığın boyutu sınırlıdır çünkü ben ücretsiz gerektiğidir . Ama ben onu geri vermek istiyorum, bu yüzden fonksiyonda serbest kalamıyorum, değil mi? Tahsis edilen belleği fonksiyonun dışında serbest bırakabilir miyim (fonksiyonu çağıracağım). Bunun için en iyi uygulamalar var mı? Şimdiden teşekkür ederim!

+2

fonksiyonu dışına boşaltmak için. Malloc'd belleğin yine de fonksiyonun içinde serbest bırakılması gerekliliği yoktur. – futureelite7

+0

Tabii ki. Bu malloc'un bütün noktasıdır. Bunu yapamazsan, malloğun hiç yaratılmış olmasının bir sebebi olmayacaktı. –

cevap

9

) olarak

void queueBulkDequeue(queueADT queue, char *pElements, unsigned int size) 
{  
    unsigned int i;  
    for (i=0; i<size; i++)  
    {   
     *(pElements+i) = queueDequeue(queue);  
    }  
    return; 
} 

öbek üzerinde olup yığın üzerinde, ne olursa sizi hangi fonksiyonu erişebilirsiniz değil. Eğer malloc() 'ın belleğini geçmek istiyorsanız, onu arayandan özgürleştirmekten başka hiçbir seçeneğiniz yoktur. (Referans sayma açısından, yani bir mülkiyet transferi denir budur.) Sen sahip olacak

4

Evet, size işlevi dışında dediğimiz bir işleve tahsis belleği boşaltın; Bu, bu durumda yapmanız gereken tam olarak budur.

Alternatifler işlevi bir tampon ve uzunluğunu geçtikten ve arayanın, fgets yapma yönteminin, gerçek uzunluk geri içerir. Bu en iyi alternatif olmayabilir, çünkü arayanların bir döngü içinde işlevinizi çağırması gerekir.

+0

Downvoter, nazik ne düşünüyorsun bu cevap yanlış açıklama yapın. – dasblinkenlight

10

1) Evet, (özgür olabilir) fonksiyonu

2) Hayır, işlevi içine boşaltın ve işlev dışındaki iletilen verileri olamaz dışında malloc'ed hafıza, bu nedenle 1 yapmalısınız) burada kıt bellek hakkında endişeleniyorsanız

3), bir segfault

+1

"... bir segfault" Ya da daha da kötüsü, gömülü bir sistemde. Eğer işlev dışındaki bir malloc'd bellek serbest zaman –

+0

evet, bu konuda endişe yok. Bunu nasıl düzeltebilirsin? – KiL

+0

@KiL "fix", bellek ayırma rutinlerinin istediğiniz belleği tahsis edemediği durumla başa çıkmak ve NULL işaretçisi tarafından b0rkened edilen herhangi bir denetim iş parçacığının yerine zarafetsiz olarak başarısız olur. – tbert

7

yol sonra muhtemelen burada yapamazlarsa daima hafıza tahsisleri , gelen başarısızlık için kontrol edilmesi gereken Tabi ki, geri döndüğünüzde bu fonksiyonun dışında bir fonksiyonda tahsis edilen belleği serbest bırakabilirsiniz. t.

Fakat, alternatif aşağıda, arayan sadece & ayırır nerede gibi işlevini değiştirmek olacaktır belleği boşaltır. Bu, hafızayı ayıran hafızayı tahsis etme sorumluluğunu alan işlev kavramı ile aynı çizgide olacaktır. // arayana malloc (tarafından ayrılan bellek olarak

char *pElements = malloc(size * sizeof(char)); 
queueBulkDequeue(queue, pElements, size); 
//Use pElements 
free(pElements); 
İlgili konular