1

在下面的代码中,我将构造函数和析构函数设为私有,并创建了自己的实例化和删除函数。但是当我调用该Delete()函数时,delete this它里面的语句似乎删除了对象但没有通知编译器,所以它认为对象仍然存在。我认为将指针设置为 null 或零是个好主意,所以我this = 0在 delete 语句之前放了一个,但它根本不起作用。Delete()为了完全删除对象及其指针,我应该在函数中放入什么?

class MyClass
{
private:
  MyClass() {}
 ~MyClass() {}
public:
  static MyClass *Instantiate()
  {
    MyClass *inst = new MyClass;
    return inst;
  }
  void Delete()
  {
    delete this;
  }
};

int main()
{
  MyClass *inst1 = MyClass::Instantiate();
  inst1->Delete();
  return 0;
}
4

2 回答 2

3

尽管您没有明确表达,但我相信您想知道为什么inst1NULL调用Delete(). 如果是这样,请考虑:

随着inst1->Delete();您成功删除inst1指向的对象。但是,指针inst1保持不变。它只指向内存中不再是MyClass.

此外,成员函数 call 也极为罕见delete this,尽管从语法和语义上讲,您的示例没有任何问题。

于 2013-03-03T17:04:15.347 回答
2

你不可以做这个。指向对象的指针需要在外部进行管理,因为对象本身无法访问它们(this是本地的、自引用的指针,除此之外不代表任何其他内容。)

如果您想自动跟踪指针,您将使用智能指针类(http://en.wikipedia.org/wiki/Smart_pointer#C.2B.2B_smart_pointers)。但是,由于您将 dtor 设为私有,因此您将失去该能力。当然,您仍然可以编写自己的智能指针类。

于 2013-03-03T17:04:05.907 回答