C ++删除对象作为参考

时间:2017-03-12 17:00:03

标签: c++ pointers memory reference heap

我总是以正确的方式在C ++中分配和清理内存。

SomeObject *Object = new SomeObject();

delete Object;

但是,最近我发现这个编译并执行。

SomeObject *Object = new SomeObject();

delete &Object;

那么内存中发生了什么?是正确清理还是仅删除对象的引用,将其留在内存中?

2 个答案:

答案 0 :(得分:4)

这是错的,简单明了。

你没有动态分配Object(你只是动态分配它所指向的东西),所以通过将其地址传递给delete,你可以给你的程序提供未定义的行为。

这是一个大致相同的例子:

int  x   = 42;
int* ptr = &x;

delete ptr;   // yikes!

任何可能发生的事情都会发生,包括出现在工作中或让我成为一个更愉快的人。

答案 1 :(得分:4)

首先,&运算符的含义取决于上下文。在您使用它的上下文中,它与引用无关,但是 address-of 运算符。

你分配的指针和数据有点半图形,如下所示:

+---------+     +--------+     +------------------------------+
| &Object | --> | Object | --> | Instance of SomeObject class |
+---------+     +--------+     +------------------------------+

也就是说,&Object指向变量Object所在的位置,Object指向SomeObject类的实例所在的位置。

当您执行delete &Object时,您告诉系统释放为变量Object分配的内存,但是您没有自己分配的内存(您将内存分配到Object <强> )。将无效指针传递给delete会导致未定义的行为