删除从另一个指针分配的指针,我应该再次删除另一个吗?

时间:2012-11-06 20:58:53

标签: c++ pointers

所以,这是我解释这个问题的例子

void * p1;
int * p2, * p3;

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

释放内存,以下3行是否相等?

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

我使用的原因是我想在不知道其类型的情况下传递函数之间的指针,例如我定义一个void指针并通过调用其他函数来改变它的值,如下所示:

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?

谢谢!

4 个答案:

答案 0 :(得分:7)

是的,所有3 delete都是等效的。值得注意的是,在发布的示例中,所有3个指针都指向同一个东西。这意味着,如果您delete其中一个,则不应delete其他人,因为他们指向的内存已经被释放。

如果您尝试delete已发布的内容,则会引发未定义的行为。如果你很幸运,你的程序会崩溃,但任何事情都可能发生。

答案 1 :(得分:7)

这个问题包含一个误解:你没有删除 指针。您删除了指向的内容。

你不能多次删除同样的东西

想想三个人将手指指向同一个盒子。其中一人说“扔掉 it ”。一旦它被抛出,它们将保持用他们的手指指向同一方向朝向空的空间。没有什么可以扔掉的。

答案 2 :(得分:3)

您只有一个分配,因此只需要删除一个。你有三个项目可以让你找到那个内存(你的指针),所以任何人都可以将它释放回O / S.一旦释放回O / S,小心不要使用任何旧指针,因为它们仍然保存现在释放的内存的旧地址。使用释放的内存很糟糕。

答案 3 :(得分:0)

是的,这三个都是等价的。调用delete之后你唯一想做的就是将指针设置为nullptr,这样你就可以告诉它们不再有效了:

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

请记住,指针指向内存。当你这样做时:

p2 = new int;

你说'告诉我一些新的记忆并在p2中保留它的地址'。现在您可以使用p2访问该内存。

执行此操作时:

p1 = p2;

你说'我希望p1指向p2指向的相同内存'。你现在有两个指针指向同一个内存

如果在任何一个指针上调用delete,它将删除该内存,并且所有这些指针现在将指向相同的已释放内存(即它们现在无效)。

释放内存后通常要做的是让指针变量超出范围或将它们设置为nullptr,以便检测它们不再有效。