對於C來說我是新的。我已經看到,在許多例子中malloc()總是與free()配對。但是,如果我做這樣的事情:說,* p =「一個字符串」,我可以釋放指針p,它會導致內存泄漏問題?C指針和內存泄漏
編輯:感謝所有的答覆! 所以我的問題變成:如果我在函數中有* p =「一個字符串」,這是否意味着所有用於此函數調用的內存將在編譯器自動「釋放」不得不手動管理任何東西來處理內存?
對於C來說我是新的。我已經看到,在許多例子中malloc()總是與free()配對。但是,如果我做這樣的事情:說,* p =「一個字符串」,我可以釋放指針p,它會導致內存泄漏問題?C指針和內存泄漏
編輯:感謝所有的答覆! 所以我的問題變成:如果我在函數中有* p =「一個字符串」,這是否意味着所有用於此函數調用的內存將在編譯器自動「釋放」不得不手動管理任何東西來處理內存?
對於初學者來說,你應該寫const char *p = "a string";
,因爲它是未定義行爲修改字符串文字(例如使用之類的語句p[0] = 'A';
)。丟棄const
會讓你陷入麻煩。
而且您不能嘗試刪除指針內存;那也是未定義的行爲。
黃金法則:malloc
和free
是總是配對。
請放心,在您的情況下,您的字符串文本佔用的內存將在程序退出時由C運行時正常釋放回操作系統。
您最後一句話,通過在程序退出時說,這意味着如果我有一個functionA(),它包含* p =「一個字符串」,如果函數A在程序退出前被調用了十億次,它將用完所有內存? –
@Hugh H,也許如果你有一個特別糟糕的編譯器,那麼是的。但編譯器將所有字符串文字存儲在內存池中非常簡單;在程序執行之前概念上。 – Bathsheba
@Hugh H基本上,程序中的「字符串」的每個實例都映射到內存的相同部分。這是好的,因爲你不能改變字符串文字。無論您使用字符串文字多少次,它永遠不會使用更多空間來存儲它。 –
當你做*p = "a string"
,你有一個指針p
指向一個字符串文字。在這種情況下沒有動態分配內存。所以,不需要免費p
,也不應該。
不,你不能釋放它,也不應該。
當您將指針指向例如一個字符串文字,它指向你未分配的內存。您應該只釋放您明確分配的內存(例如,使用malloc
,calloc
或strdup
)。
其他函數可能會分配您需要釋放的內存,但是他們應該在它們的文檔中聲明。作爲一般的經驗法則:如果你明確地分配一些資源(如內存或文件),那麼你也應該釋放它。
提到可能存在內存泄漏的其他來源(例如'fopen()' - 'fclose()'pair)等)+1 – ryyker
編號「一個字符串」是存儲在只讀靜態存儲器中的數據,p是一個指向它的指針。你只釋放指向malloc分配的內存的指針。
你不需要釋放這個指針,因爲它指向一個字符串常量。如果您嘗試釋放它,實際上可能會導致未定義的行爲。
內存管理的基本規則:如果您調用malloc()
來獲取內存,那麼當您不需要它時,請使用free()
來釋放它。
你可以釋放它,但如果你不會泄漏 –
只有通過malloc動態分配的內存,我們需要使用'free()'函數顯式釋放calloc函數。 –
如果你做'char * p =「一個字符串」;'那麼你以後不會釋放那個內存。這是由編譯器管理的,因爲你沒有使用'malloc'或'calloc'。 – lurker