不清楚`删除'和指针

rub*_*nvb 1 c++ pointers delete-operator

假设我们有一段代码:

//...
class A
//...
A* myA = new A();
A* myPointerToMyA = myA;
delete myA;
delete myPointerToMyA; // this is wrong, no?
//...
Run Code Online (Sandbox Code Playgroud)

最后一行与上面一行完全相同,对吗?所以我现在将是delete一个无效的/ NULL指针?

我知道这可能是一个愚蠢的问题,但我仍需要一些保证.

小智 5

确实这是错的.并且与其他评论相反,并不是因为你没有用新的分配它.

myA和myPointerToMyA都指向同一个东西.通过它们中的任何一个删除都很好 - 但是你只能合法地删除它,因为它们指向同一个东西 - 它被指向的是被删除的,而不是指针本身.

有两个指向同一个东西的指针是没有错的,但是你可以跟踪谁拥有它,以及谁负责删除它.

在这种情况下,删除指向已删除对象的指针,行为是"未定义的" - 运行时可以执行它喜欢的操作!(我几乎可以保证你不会喜欢它......)


Jon*_*vis 5

是的,这是错的.使用时delete,您不是要删除指针.相反,你要删除它指向的内容.因此,当您使用delete on指针时,该指针指向的内存将被释放.指向该内存的任何其他指针现在指向未分配的内存,并且是一个悬空指针.使用悬空指针会导致未定义的行为,并且尝试释放已释放的内存当然无效,因此delete在悬空指针上使用肯定是错误的.它可能会导致分段错误.