2012-11-06 33 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' –