假设我们有一段代码:
//...
class A
//...
A* myA = new A();
A* myPointerToMyA = myA;
delete myA;
delete myPointerToMyA; // this is wrong, no?
//...
最后一行的作用与上面的完全一样,对吗?所以我现在会是delete
一个无效/空指针?
我知道这可能是一个愚蠢的问题,但我仍然需要一些保证。
假设我们有一段代码:
//...
class A
//...
A* myA = new A();
A* myPointerToMyA = myA;
delete myA;
delete myPointerToMyA; // this is wrong, no?
//...
最后一行的作用与上面的完全一样,对吗?所以我现在会是delete
一个无效/空指针?
我知道这可能是一个愚蠢的问题,但我仍然需要一些保证。
确实是错的。与其他评论之一相反,这并不是因为您没有将其分配给新的。
myA 和 myPointerToMyA 都指向同一个东西。通过它们中的任何一个删除都可以 - 但你只能合法地删除它一次,因为它们指向同一个东西- 删除的是指向的内容,而不是指针本身。
拥有两个指向同一事物的指针并没有错,但是您必须跟踪谁拥有它,以及谁负责删除它。
在这种情况下,删除指向已删除对象的指针,行为是“未定义的” - 运行时可以做它喜欢的事情!(我几乎可以保证你不会喜欢它......)
是的,这是错误的。当您使用 时delete
,您不会删除指针。相反,您正在删除它指向的内容。因此,当您使用delete on
指针时,该指针指向的内存将被释放。指向该内存的任何其他指针现在都指向未分配的内存并且是悬空指针。使用悬空指针会导致未定义的行为,尝试释放已经释放的内存肯定是无效的,因此delete
在悬空指针上使用肯定是错误的。它可能会导致分段错误。
你在这里得到的是以下内容:
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)
最后两行最后相等。此代码将导致未定义的行为。
是的,这是错误的。分配给分配new A()
和释放的内存delete myA
。需要注意的一点是,虽然delete myPointerToMyA
是尝试删除无效指针,但它不是尝试删除 NULL 指针,因为myPointerToMyA
不等于NULL
.
2个指针指向同一个对象。delete myA;
在您第一次调用后,该对象将被销毁。当您第二次调用 delete( delete myPointerToMyA;
) 时,您试图多次删除对象,并且此类操作的结果是未定义的(通常您会遇到运行时异常)。