2011-06-23 49 views
4

我有一個C程序,經常使用char *str[xx]工作人員。 某些字符串使用賦值運算符(=)填充,不需要釋放。 但一些其他(在同一陣列中),使用其strdup()需要在節目的結束被釋放被填充:使用免費()函數的問題

字符* STR [10];

str [i] =「Hi」;

str [k] = strdup(「hi」);

字符串指針兩者都是非零,並釋放STR [1]將自然地產生「賽格故障」。 我的問題是,在我的程序結束時,我沒有跟蹤哪個指針指向由strdup()生成的字符串。你能幫我怎麼找到由strdup生成的字符串,以便我可以釋放它們嗎? 謝謝

+0

沒有必要在程序結束時釋放strdup()內存。內存將在退出時自動釋放()。 – mark4o

回答

0

處理此問題的正確方法是通過malloc()strdup()跟蹤動態分配的內容。

你必須重構你的程序才能達到這個目標。

6

不幸的是,沒有語言功能可以(可移植地)區分指向動態分配內存的指針和不支持的指針。您可以手動保存動態分配的索引列表。或者,如果性能不是一個大問題,則選擇總是在堆上分配。

+2

+1始終在堆上分配是最實際的解決方案 –

+0

或者如果字符串長度受'N'限制,則一次預先分配'N * xx + xx'個字節,並使用'strncpy'分配。 –

0

也許你可以使用一個命名約定,以幫助你記住哪個是哪個:

char *str[10]; 
char *str_p[10]; 

str[i]="Hi"; 

str_p[k]=strdup("hi"); 

(或使用結構的指針,並顯示出該特定指針是動態分配的標誌)