将析构函数设为私有有什么用?


当前回答

COM使用此策略删除实例。COM使析构函数私有,并提供删除实例的接口。

下面是一个Release方法的示例。

int MyRefCountedObject::Release() 
{
 _refCount--;
 if ( 0 == _refCount ) 
 {
    delete this;
    return 0;
 }
 return _refCount;
}

ATL COM对象就是这种模式的一个主要例子。

其他回答

基本上,任何时候你想让其他类负责你类对象的生命周期,或者你有理由阻止对象的销毁,你都可以将析构函数设为private。

例如,如果您正在做一些引用计数的事情,您可以让对象(或已被“好友”化的管理器)负责计算对自己的引用数量,并在数量为零时删除它。私有dtor可以防止其他人在仍然有引用的情况下删除它。

另一个例子是,如果你有一个对象,它有一个管理器(或它本身),可以根据程序中的其他条件(比如正在打开的数据库连接或正在写入的文件)销毁它或拒绝销毁它。您可以在类或管理器中有一个“request_delete”方法,它将检查该条件,它将删除或拒绝,并返回一个状态,告诉您它做了什么。这比调用delete要灵活得多。

COM使用此策略删除实例。COM使析构函数私有,并提供删除实例的接口。

下面是一个Release方法的示例。

int MyRefCountedObject::Release() 
{
 _refCount--;
 if ( 0 == _refCount ) 
 {
    delete this;
    return 0;
 }
 return _refCount;
}

ATL COM对象就是这种模式的一个主要例子。

当您不希望用户访问析构函数时,也就是说,您希望只通过其他方式销毁对象。

http://blogs.msdn.com/larryosterman/archive/2005/07/01/434684.aspx给出了一个例子,其中对象被引用计数,并且只有当计数为零时才会被对象本身销毁。

这可能是在Windows中处理问题的一种方法,其中每个模块可以使用不同的堆,例如Debug堆。如果这个问题处理不当,就会发生不好的事情。

我知道你在问私有析构函数。下面是我如何使用受保护的。其思想是,您不想通过向main类添加额外功能的类的指针来删除main类。 在下面的例子中,我不希望通过HandlerHolder指针删除GuiWindow。

class Handler
{
public:
    virtual void onClose() = 0;
protected:
    virtual ~Handler();
};

class HandlerHolder
{
public:
    void setHandler( Handler* );
    Handler* getHandler() const;
protected:
    ~HandlerHolder(){}
private:
    Handler* handler_;
};

class GuiWindow : public HandlerHolder
{
public:
    void finish()
    {
        getHandler()->onClose();
    }

    virtual ~GuiWindow(){}
};