在下面的代码中,我将构造函数和析构函数设为私有,并创建了自己的实例化和删除函数。但是当我调用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;
}
答案 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私有化了,你就失去了这种能力。当然,你仍然可以编写自己的智能指针类。