2012-11-06 132 views
3

所以,這裏是我的例子來說明這個問題刪除從另一個指針分配的指針,我應該再次刪除另一個指針嗎?

void * p1; 
int * p2, * p3; 

p2 = new int; 
p1 = p2; 
p3 = (int *) p1; 

釋放內存,有以下3條線路相互等同?

delete p2; 
delete p3; 
delete (int *) p1; 

我使用這樣的原因是,我想傳遞函數之間的指針不知道它的類型,例如我定義了一個空隙的指針,並通過調用其它函數如下地改變其值:

void * p1; 
func1(p1); //in this function, p2 = new int and p1 is assigned as p1 = p2; 
func2(p1); //in this function, p1 is assigned to another pointer: int * p3 = (int *)p1; 

然後,我打電話FUNC3釋放內存

func3(p1); //delete int * p1 

調用FUNC3後,我一定要了應對FUNC1 P2?

謝謝!

+5

一個'刪除'預'新'。一個'刪除[]'預'新[]'。在這種情況下,您應該使用智能指針。 – andre

回答

7

是的,所有3 delete s都是等效的。需要注意的是,在發佈的示例中,所有3個指針指向相同的東西。這意味着如果你delete其中之一,你不應該delete其他人作爲他們指向的內存已被釋放。

如果您嘗試使用delete已發佈的東西,則會引發未定義的行爲。如果你很幸運,你的程序會崩潰,但任何事情都可能發生。

3

你只有一個分配,所以只需要一次刪除。你有三個項目可以讓你找到這個內存(你的指針),所以任何將它釋放回O/S。一旦釋放回O/S,請注意不要使用任何舊指針,因爲它們仍然保存着您現在釋放的內存的舊地址。去使用釋放的內存是不好的。

7

這個問題含有一個誤解:你不要刪除指針。你刪除他們指向

而且您不能一次刪除相同的東西

想想三個人將他們的手指指向同一個盒子。其中一人說「扔」。一旦它被拋出,它們仍然會保持手指仍然朝着空的空間指向相同的方向。沒有更多的東西可以扔掉。

+0

很好的解釋! – Joe

0

是的,這三個都是等價的。你可能想調用刪除後做的唯一的事情就是設置指針nullptr這樣你就可以告訴他們不再是有效的:

p1 = nullptr ; 
p2 = nullptr ; 
p3 = nullptr ; 

記住指針點內存。當你這樣做:

p2 = new int; 

你說'聲明我一些新的記憶,並保留它的地址在p2'。現在您可以使用p2訪問該內存。

當你這樣做:

p1 = p2; 

你是說「我想P1爲指向P2指向相同的內存」。你現在有兩個指針指向相同的內存

如果您在任何一個指針上調用delete,它將刪除該內存,並且所有這些指針現在將指向相同的釋放內存(即它們現在無效)。

釋放內存後通常要做的事情是讓指針變量超出範圍或將它們設置爲nullptr,以便可以檢測到它們不再有效。

+1

語義挑剔:「0」不是「NULL」不是「nullptr」。應該使用'nullptr',如果在C++ 11之前使用舊版C++,則使用'NULL'。 –

+0

是的。我在使用C++ 11之前正在寫這篇文章,並且仍然習慣於'#define NULL 0' –