受保护的析构函数的基本原理

时间:2015-07-20 02:21:48

标签: c++ poco-libraries

我注意到许多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进行动态分配会浪费资源。

我的问题是:这是什么理由,我忽略了什么?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如前所述,Poco :: RefCountedObject具有受保护的析构函数,因此无法在堆栈上创建从中继承的所有类。原因是因为它们在引用计数达到零时自行删除,因此在堆栈上创建它们会导致未定义的行为 - 它们主要用于与Poco :: AutoPtr一起使用,但这不是强制性的 - 您也可以手动引用计数,使用duplicate()和release()。

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

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