【问题标题】:C++ delete object as referenceC++ 删除对象作为参考
【发布时间】:2017-08-02 16:24:51
【问题描述】:

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

SomeObject *Object = new SomeObject();

delete Object;

但是,最近我发现它可以编译并执行。

SomeObject *Object = new SomeObject();

delete &Object;

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

【问题讨论】:

  • “但是,最近我发现它编译和执行都很好。” 对我来说看起来像 未定义的行为
  • @πάνταῥεῖ 好吧,它执行得很好只不过是一种适当的未定义行为,不是吗? :-D(注意:只是开玩笑)
  • 糟糕的代码但很好的问题。看不到投反对票的理由。
  • @skypjack 当然,这是可能的结果之一 ;-)
  • "并且执行得很好。"不,它没有。允许未定义的行为使用精神电子精神控制使其看起来执行良好。

标签: c++ pointers memory reference heap-memory


【解决方案1】:

这是错误的,简单明了。

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

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

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

delete ptr;   // yikes!

任何不太可能的事情都可能发生,包括看起来在工作或让我成为一个更愉快的人。

【讨论】:

  • 请注意,在破坏delete之后,您还泄露了SomeObject
  • 我知道,我的问题是执行期间堆上发生了什么。
  • @DailyDoseOfAwesome 它最终在我的冰箱里爆炸了。
  • @DailyDoseOfAwesome:没什么好处,因为您要从“堆”中删除一些一开始就不存在的东西。
【解决方案2】:

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

指针和您分配的数据看起来有点像这样:

+---------+ +--------+ +---------------------------- --+ | &对象 | --> |对象 | --> | SomeObject 类的实例 | +---------+ +--------+ +---------------------------- --+

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

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

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 2016-07-25
    • 2013-05-28
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多