不清楚`删除'和指针

时间:2010-06-30 16:36:16

标签: c++ pointers delete-operator

假设我们有一段代码:

//...
class A
//...
A* myA = new A();
A* myPointerToMyA = myA;
delete myA;
delete myPointerToMyA; // this is wrong, no?
//...

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

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

6 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

你是对的。

  

所以我现在要删除一个无效的/ NULL指针?

嗯,技术上它只是无效,因为没有设置为NULLIt's ok to delete a NULL pointer

答案 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;)时,你试图多次删除对象,并且这种操作的结果是未定义的(通常你得到运行时异常)。