【问题标题】:Rationale for protected destructor受保护的析构函数的基本原理
【发布时间】:2015-10-09 01:49:11
【问题描述】:

我注意到许多 Poco 类都有一个受保护的析构函数。这使他们更讨厌编码。例如这里是我的一些代码:

struct W2: Poco::Util::WinRegistryConfiguration
{
    typedef Poco::Util::WinRegistryConfiguration inherited;
    using inherited::inherited;
};

std::string get_documents_folder()
{
    W2 regc { "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"  };
    return regc.getString("Personal", "");
}

当然,如果我可以取消W2 并让regc 具有WinRegistryConfiguration 类型,那会简单得多。但这是不可能的,因为受保护的析构函数。

我意识到可以改用Poco::AutoPtr,但是当自动分配应该可以正常工作时,使用new进行动态分配会浪费资源。

我的问题是:这是什么原因?我是否忽略了什么?

【问题讨论】:

    标签: c++ poco-libraries


    【解决方案1】:

    原因是 WinRegistryConfiguration 是引用计数的(继承自 Poco::RefCountedObject)。受保护的析构函数旨在防止客户端实例化堆栈上的类,或直接删除对象。相反,您应该通过 new 实例化该类,并通过 RefCountedObject 方法管理生命周期。

    我不熟悉 Poco,但应该还有一个智能指针类,通过自动调用 RefCountedObject 方法来管理引用计数的对象。

    【讨论】:

      【解决方案2】:

      正如已经回答的那样,Poco::RefCountedObject 具有受保护的析构函数,因此从它继承的所有类都不能在堆栈上创建。原因是当引用计数达到零时它们会自行删除,因此在堆栈上创建它们会导致未定义的行为 - 它们主要用于 Poco::AutoPtr,但这不是强制性的 - 您也可以手动引用计数,使用复制()和释放()。

      查看您的代码,您可能正在寻找WinRegistryKey,您可以像这样使用它:

      std::string get_documents_folder()
      {
        Poco::Util::WinRegistryKey regKey("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders");
        return regKey.getString("Personal", "");
      }
      

      【讨论】:

        猜你喜欢
        • 2013-11-03
        • 2012-12-24
        • 2011-03-15
        • 2014-08-29
        • 1970-01-01
        • 2020-03-06
        • 2012-11-23
        • 2020-04-28
        • 2013-05-18
        相关资源
        最近更新 更多