如何使用同一个类的成员函数删除当前的类实例

时间:2013-03-03 16:58:07

标签: c++ class instance

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

2 个答案:

答案 0 :(得分:3)

虽然您没有明确表达,但我相信您在调用inst1后想知道为什么NULL不是Delete()。如果是这样,请考虑一下:

使用inst1->Delete();成功删除指向的对象inst1。但是,指针inst1保持不变。它只指向内存中某个不再是MyClass的有效实例的地方。

成员函数调用delete this的情况极为罕见,尽管从语法和语义上来说,你的例子没有任何问题。

答案 1 :(得分:2)

你不能这样做。对象的指针需要在外部进行管理,因为对象本身无权访问它们(this是一个本地的自引用指针,并不表示除此之外的任何内容。)

如果您想自动跟踪指针,可以使用智能指针类(http://en.wikipedia.org/wiki/Smart_pointer#C.2B.2B_smart_pointers)。但是既然你把dtor私有化了,你就失去了这种能力。当然,你仍然可以编写自己的智能指针类。

相关问题