我总是以正确的方式在C ++中分配和清理内存。
SomeObject *Object = new SomeObject();
delete Object;
但是,最近我发现这个编译并执行。
SomeObject *Object = new SomeObject();
delete &Object;
那么内存中发生了什么?是正确清理还是仅删除对象的引用,将其留在内存中?
答案 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
会导致未定义的行为。