假設以下情形:char *爲char [] - 是否有必要?
while(!notTheEnd) {
char str[1024];
char* ptr_to_str;
/* some strcat, strcpy on str */
ptr_to_str = str;
chmod(ptr_to_str, 0777);
}
我必須設置的char * ptr_to_str = NULL和自由,以避免內存泄漏?
只是我在想的一個理論問題。
假設以下情形:char *爲char [] - 是否有必要?
while(!notTheEnd) {
char str[1024];
char* ptr_to_str;
/* some strcat, strcpy on str */
ptr_to_str = str;
chmod(ptr_to_str, 0777);
}
我必須設置的char * ptr_to_str = NULL和自由,以避免內存泄漏?
只是我在想的一個理論問題。
你只需要free()
你有什麼malloc()
ed。因此:
又見了free()手冊頁:
的free()函數釋放內存空間由PTR,必須已返回由以前調用的malloc()指出,釋放calloc ()或realloc()。否則,或者如果釋放(ptr)之前已被調用,則會發生未定義的行爲。如果ptr爲NULL,則不執行任何操作。
注意,其它功能可以使用malloc()
或類似內部因此也要求返回的緩衝區(例如strdup)被free'd。不需要設置指針NULL
的指針。然而,它增加了一些便利,因爲對該指針的後續調用free()
不會將應用程序暴露給未定義的行爲。而且,如果一致地完成,您可以檢查指針是否確實指向一個對象。
好的,謝謝。我想到了這樣的事情,但在某種程度上,我有點不確定O :-) – Stefan
您從未撥打malloc()
,因此您無需致電free()
。
你有什麼是一個指向堆棧上的字符數組的指針,它不需要顯式的重新分配。
不,只要你不分配內存(在堆上),你不需要釋放它。有一些例外(如strdup
),但這是一般規則。
將在當前堆棧中分配1024個字節。當函數返回時,這個空間將自動「彈出」。所以你不需要明確地釋放這個內存。
'while(!notTheEnd)' - 「while not not end」?看起來像一個錯誤。 – Jesper
哈哈你是對的。只是一個快速虛構的場景;)沒有真正的代碼。 – Stefan
ptr_to_str只是一個不會忘記的指針,你必須找出實際數據來自哪裏,在這種情況下,它來自你的本地(讀取:堆棧)變量'str'。由於它是在堆棧中分配的,因此不需要釋放/刪除它。 – fileoffset