【问题标题】:C++ deleting a object from it's own classC++ 从它自己的类中删除一个对象
【发布时间】:2018-10-21 17:32:20
【问题描述】:

我有以下情况。

FooClass* fooPointer = new FooClass();

int main() {
  while (/*logic*/) {
    if (fooPointer) {
      // some logic
    }
  }
}  

class FooClass {
  void fooClass::fooMethod() {
    if (/*logic*/) {
      //logic
      delete this;
    }     
  }
}

所以我基本上是在删除对象。但是在下一次迭代时还是会进入main方法中的if语句(

if (fooPointer) {
  // some logic
}

)。

为什么它不能通过空检查识别出该对象已被删除?

【问题讨论】:

  • delete 不会将指针设置为空。它根本不会改变它。你应该重新考虑你的设计,这是错误的道路。
  • 问个问题,为什么while循环里面的// some logic不是确定,然后删除fooPointer那里,然后设置为nullptr ?尽管有 COM 对象的实现,delete this; 几乎总是一种设计气味。
  • 最好使用 std::unique_ptr,可能带有自定义删除器。
  • @WhozCraig 至于你的问题,因为删除逻辑在 FooClass 中的许多嵌套方法之一中
  • @john 我怀疑,但香气一样腐烂。充其量(我用这个词很松散,因为这感觉就像我在促成一个糟糕的设计的犯罪),FooClass 构造函数可以引用一个指向自毁的清除指针,保留为FooClass 实例的一部分,并在 delete this; 之前立即无效。这是一个可怕的解决方案画在角落。不管怎样,如果你保持这个设计,你必须有一个指向外部拥有指针的路径,以免你让它悬空,而目前你没有。

标签: c++


【解决方案1】:

在对象上调用delete 通常会做两件事:

  1. 它调用析构函数
  2. 它释放对象的内存

不会将任何内容设置为 null,也不会以任何其他方式更改指针的值。这就是为什么您的检查不起作用的原因。

因此,如果您想这样做,则必须以某种方式自己使指针为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2021-07-11
    • 2012-06-11
    • 1970-01-01
    • 2018-09-14
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多