假设我们有一段代码:
//...
class A
//...
A* myA = new A();
A* myPointerToMyA = myA;
delete myA;
delete myPointerToMyA; // this is wrong, no?
//...
最后一行与上面一行完全相同,对吗?所以我现在delete
无效/空指针?
我知道这可能是一个愚蠢的问题,但我仍需要一些保证。
答案 0 :(得分:5)
确实是错的。与其他一条评论相反,并不是因为你没有用新的分配它。
myA和myPointerToMyA都指向同一件事。通过它们中的任何一个进行删除都很好 - 但是你只能合法地删除它,因为它们指向同一个东西 - 指向的是被删除的,而不是指针本身。
有两个指向同一个东西的指针是没有错的,但你可以跟踪谁拥有它,以及谁负责删除它。
在这种情况下,删除指向已删除对象的指针,行为是“未定义” - 运行时可以执行它喜欢的操作! (我几乎可以保证你不会喜欢它......)
答案 1 :(得分:5)
是的,这是错的。使用delete
时,您不会删除指针。相反,你要删除它指向的内容。因此,当您使用delete on
指针时,该指针指向的内存将被释放。指向该内存的任何其他指针现在指向未分配的内存,并且是悬空指针。使用悬空指针会导致未定义的行为,并且尝试释放已释放的内存当然无效,因此在悬空指针上使用delete
肯定是错误的。它可能会导致分段错误。
答案 2 :(得分:1)
答案 3 :(得分:1)
您将在此处获得以下内容:
A* myA = new A(); // myA is now equal to 0x11110000 for example(!)
A* myPointerToMyA = myA; // myPointerToMyA is now equal to 0x11110000
delete myA; // equal to delete (A*)(0x11110000)
delete myPointerToMyA; // equal to delete (A*)(0x11110000)
最后两行最后相等。此代码将导致未定义的行为。
答案 4 :(得分:0)
是的,这是错的。分配给new A()
分配的内存,并与delete myA
一起发布。需要注意的一点是,虽然delete myPointerToMyA
是尝试删除无效指针,但它并不是尝试删除NULL指针,因为myPointerToMyA
不等于NULL
。
答案 5 :(得分:0)
2个指针指向同一个对象。第一次调用delete myA;
后,对象会被破坏。当你第二次调用delete(delete myPointerToMyA;
)时,你试图多次删除对象,并且这种操作的结果是未定义的(通常你得到运行时异常)。