我在C++下面的函數內存泄漏在C /內存分配++
void func1()
{
char *p = "Test for memory leak";
}
當func1()
被稱爲其中該變量的存儲器分配的?無論是在堆棧還是堆?應該明確調用delete p;
嗎?
我在C++下面的函數內存泄漏在C /內存分配++
void func1()
{
char *p = "Test for memory leak";
}
當func1()
被稱爲其中該變量的存儲器分配的?無論是在堆棧還是堆?應該明確調用delete p;
嗎?
不,內存僅分配給堆棧上的指針p
。該內存在p
超出範圍時自動回收。 p
只是指向一個字符串,它存儲在程序的只讀部分中的某處。理想情況下,它應該被定義爲const char *p
。如果您嘗試delete
它,它將是未定義的行爲。通常,您可以記住,每撥打new
,都需要撥打delete
字符串文字的內存分配在靜態存儲中,分配持續時間是整個程序運行時間。你不應該調用delete - 調用delete會導致未定義的行爲。
字符串文字通常位於可執行文件的只讀文本段中。調用free/delete會導致不好的事情。
根本沒有內存泄漏。如果您查看編譯後的代碼,則字符串Test for memory leak\0
實際上是可執行程序的一部分 - 並且加載程序會在執行過程中將其複製到內存中。程序終止後,操作系統清除這個預先加載的內存。
變量*p
本身在函數被調用時被分配在堆棧上,當函數返回指針從堆棧中被移除時。
delete
需要使用new
調用分配的內存(僅適用於從堆中獲取的內存)。
new和new []運算符用於在C++堆中明確分配內存。
規則是
1.呼叫delete
爲每new
運營商使用
2.呼叫delete[]
每使用new[]
操作。
其餘的一切都在棧上,不應該明確地釋放它。它會自動被照顧。
遵循此規則,您不會出錯。
雖然,請注意,如果您在循環中使用new並在其外部使用delete,它會導致大的內存泄漏。
最佳做法是使用智能指針,當指針超出範圍時,智能指針會自動爲您分配內存。 Boost庫爲此提供了一些不錯的選擇。瞭解更多關於在這裏:http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/smart_ptr.htm
--Samrat帕蒂爾
的函數定義一個指針p
,這是設置爲指向靜態分配的字符串"Test for memory leak"
。
什麼都不是動態分配的,所以沒有必要手動釋放。
您應該始終將呼叫配對到new
和delete
。當new
編輯時,它必須是deleted
,反之亦然。
就你而言,字符串本身是靜態的,並持續到程序終止。 而p
是堆棧上的局部變量,它持續到函數返回。
所以這兩個都由系統自動處理。
爲了確切知道是否有泄漏,可以使用調試器。我喜歡使用deleaker。有了它,你可以知道什麼時候有泄漏。並知道哪裏泄漏很容易刪除。
+1 char const * p - 強制指針只讀是好行爲,因爲它反映了指針的意圖 - 是隻讀的。 – 2009-11-30 10:02:56
.. *咳嗽*我的意思是指針指向只讀內存。指針本身不是恆定的。 – 2009-11-30 10:23:43