所以,这是我解释这个问题的例子
void * p1;
int * p2, * p3;
p2 = new int;
p1 = p2;
p3 = (int *) p1;
Run Code Online (Sandbox Code Playgroud)
释放内存,以下3行相当于彼此?
delete p2;
delete p3;
delete (int *) p1;
Run Code Online (Sandbox Code Playgroud)
我使用的原因是我想在不知道其类型的情况下在函数之间传递指针,例如我定义一个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;
Run Code Online (Sandbox Code Playgroud)
然后,我调用func3来释放内存
func3(p1); //delete int * p1
Run Code Online (Sandbox Code Playgroud)
在调用func3后,我是否必须在func1中处理p2?
谢谢!
是的,所有3 delete
秒都是等价的.值得注意的是,在发布的示例中,所有3个指针都指向同一个东西.这意味着,如果您是delete
其中之一,则不应该delete
将其他人视为已经释放的内存.
如果你尝试delete
了已经发布的东西,你会发现未定义的行为.如果你很幸运,你的程序会崩溃,但任何事情都可能发生.
这个问题包含了一种误解:你不删除的指针.您删除他们指向的内容.
并且您不能多次删除同一件事.
想想三个人将他们的手指指向同一个盒子.其中一人说"把它扔掉".一旦它被抛出,它们将保持用他们的手指指向相同的方向朝向空的空间.没有什么可以扔掉的.