2013-12-13 35 views
2
int *p = new int; 

p = NULL; 

delete p; 

這是一個內存泄漏嗎?因爲指針p指向的內存位置沒有被釋放,它只是已經被NULL的指針,當我們刪除時,它不會騰出那個內存位置。是這樣嗎 ?在刪除之前刪除指針會導致內存泄漏嗎?

+2

爲什麼有2個關閉的投票聲明這是脫離主題,因爲「詢問代碼的問題必須顯示對所解決問題的最小理解」?這個問題甚至沒有要求代碼。在選擇它之前,人們甚至會閱讀關閉原因的文本嗎? –

+0

想象一下你正在寫'operator delete'。你是否能夠釋放你先前分配的內存,如果你給出的是一個空指針? –

回答

7

是的,它的確如此。是的,事實如此。需要更多的人物!

3

你會得到內存泄漏的原因是因爲p將不再指向你想要刪除的對象。

您通常想在刪除後使NULL爲p,主要是作爲雙重刪除的安全措施,但這不是必需的。儘管如此,刪除空指針沒有不良影響。

+2

刪除後將'p'設置爲空指針實際上很少見,因爲大部分時間,'p'將會超出範圍(在析構函數中或在塊末尾刪除---大部分'delete',或者應該在析構函數中)。如果指針不再存在,那麼將'p'設置爲null將不起作用,並且不會對指向該對象的其他指針做任何事情。 (當然,在很多應用程序中,大多數'delete'都是'delete this',並且不能將'this'設置爲null。) –

2

指針只是一個指向內存地址的值 - 指針不是(!)分配的內存!因此有一個新的會請求一些分配器來保留一些內存並返回地址。刪除將要求相同的分配器釋放該內存。將指針設置爲零(在刪除之前)會使它失效並導致內存泄漏。

0

首先,在C++中刪除NULL指針實際上是「沒有工作完成」。它也不會給出任何錯誤,有時可能會給你一個錯誤,即空指針被成功刪除。其次,由於指針p指向的地址,比如說1000(內存地址值),除了這個非常指針以外,沒有其他人指出它,現在你已經改變了這個只有1000的識別器,將它設置爲NULL,發生的事情是這1000個已經獲得了一個內存空間,但現在不能被刪除,因爲「如果我什至不知道它在哪裏,我該如何刪除一些東西」。因此它是一個內存泄漏。