2014-03-12 108 views
1

部分釋放陣列假設我有一個字符串,其中一些已經free'd陣列,作爲一個例子:免費()的字符串ç

char **array; 
array = malloc(20*sizeof(char*)); 

for(i=0;i<arr_size;i++) 
{ 
    array[i]='\0'; 
    free(array[i]); 
} 
free(array); 

這是做一個正確的方法?因爲我似乎仍然得到一些內存泄漏,在我的情況下, 有20個字符串,其中9個已經釋放。

我想問題是如何去釋放「釋放」的字符串。 感謝您的幫助!

+0

這是否編譯?數組的聲明是什麼? –

+0

char **數組; array = malloc(20 * sizeof(char *)); – Pavoo

+0

那麼爲什麼單引號呢? –

回答

2

我想問題是如何去釋放「釋放」的字符串。

那麼,你不。您必須每malloc'ed字符串free一次。在相同的字符串上多次調用free將導致未定義的行爲。

這且不說,你的問題如下:

array[i]='\0'; 

在這裏,你你free前要覆蓋指針的值。

+0

另外,數組[i]尚未配對。只有數組已被插入。釋放它可能會導致崩潰。 – cup

+1

...並且正在分配一個字符而不是字符串 –

0

1 malloc()分配只需要1 free()來釋放內存。因此free(array);足以釋放內存。

free()釋放內存是動態使用malloc()來動態分配內存的計數器。

+0

不是。 'free(array)'不會'釋放內存',它只釋放指針數組,但不釋放數組項所指向的字符串。 – CiaPan

1

按照慣例,您應該始終在free -ing之後設置指向NULL的指針。然後你應該檢查指針是否爲NULL,如果不是,那麼你可以free。這樣你可以跟蹤哪些是free -ed,哪些沒有。

+2

釋放時你甚至不需要檢查NULL,'free(NULL)'是無害的。 – sth

+0

真的嗎?這對我來說是新的。 – tlehman

+0

參見7.22.3.3/2中的[本標準草案](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):「如果'ptr'是一個空指針,不會發生任何操作。「 – sth

0

使用free(array [i]);會導致問題/奇怪的錯誤,因爲您試圖釋放一個指針,其值(指針)在前一行中已更改。

代碼 array [i] ='\ 0';

可能沒有所需的結果,因爲它將指針值設置爲不是字符內容。也許sprintf(array [i],「\ 0」);會更好

char **array=NULL; //(Helps you to give it an initial value pointing to NULL) 

array = malloc(arr_size+1); 

if (!array[i]) 
{ 
// array == NULL which is not right after malloc 
// there has been an error with malloc, trap and exit somehow 
} 
else 
{ 
// Use array as you wish as it has been allocated, take care not to 
// run past the end of the array length 
} 

if (array[i]) free(array[i]); // checks that it is not NULL anymore, as NULL does not need freeing. 

你可以擴大IF語句:(指上面一樣,但包括強制釋放變量NULL)

if (array[i]!=NULL) 
{ 
free(array[i]); 
array[i] = NULL; 
}