2009-11-30 164 views
3

我在C++下面的函數內存泄漏在C /內存分配++

void func1() 
{ 
    char *p = "Test for memory leak"; 
} 

func1()被稱爲其中該變量的存儲器分配的?無論是在堆棧還是堆?應該明確調用delete p;嗎?

回答

10

不,內存僅分配給堆棧上的指針p。該內存在p超出範圍時自動回收。 p只是指向一個字符串,它存儲在程序的只讀部分中的某處。理想情況下,它應該被定義爲const char *p。如果您嘗試delete它,它將是未定義的行爲。通常,您可以記住,每撥打new,都需要撥打delete

+5

+1 char const * p - 強制指針只讀是好行爲,因爲它反映了指針的意圖 - 是隻讀的。 – 2009-11-30 10:02:56

+0

.. *咳嗽*我的意思是指針指向只讀內存。指針本身不是恆定的。 – 2009-11-30 10:23:43

15

字符串文字的內存分配在靜態存儲中,分配持續時間是整個程序運行時間。你不應該調用delete - 調用delete會導致未定義的行爲。

0

字符串文字通常位於可執行文件的只讀文本段中。調用free/delete會導致不好的事情。

1

根本沒有內存泄漏。如果您查看編譯後的代碼,則字符串Test for memory leak\0實際上是可執行程序的一部分 - 並且加載程序會在執行過程中將其複製到內存中。程序終止後,操作系統清除這個預先加載的內存。

變量*p本身在函數被調用時被分配在堆棧上,當函數返回指針從堆棧中被移除時。

0

delete需要使用new調用分配的內存(僅適用於從堆中獲取的內存)。

4

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帕蒂爾

1

的函數定義一個指針p,這是設置爲指向靜態分配的字符串"Test for memory leak"

什麼都不是動態分配的,所以沒有必要手動釋放。

您應該始終將呼叫配對到newdelete。當new編輯時,它必須是deleted,反之亦然。

就你而言,字符串本身是靜態的,並持續到程序終止。 而p是堆棧上的局部變量,它持續到函數返回。

所以這兩個都由系統自動處理。

2

爲了確切知道是否有泄漏,可以使用調試器。我喜歡使用deleaker。有了它,你可以知道什麼時候有泄漏。並知道哪裏泄漏很容易刪除。