c++ - 如何从 shared_ptr 调用私有(private)析构函数?

标签 c++ pointers destructor shared-ptr friend

我有一个 resource_manager维护 std::vector<boost::shared_ptr<resource> > 的类在内部。 resource_managerresource的好友类.我要resource s 只能由 resource_manager 创建/删除,所以我将其构造函数设为私有(private)(可以正常工作)。

但是,如果我将析构函数设为私有(private),则代码不会编译,因为析构函数由 boost::shared_ptr 调用, 这不是 resource 的 friend .我正在考虑通过只返回 const resource* 来强制执行“不要被客户删除”规则来自 resource_manager , 但不知何故我对这种方法提供的安全性不满意(如果客户端以某种方式发生在指向非常量的指针上怎么办?)

除了不使用 shared_ptr 的明显解决方案之外,对于我的问题,您有任何解决方法/更好的解决方案吗?

最佳答案

您可以将自定义删除器传递给共享指针。因此,只需创建一个删除仿函数或函数(由您决定),它又是您类(class)的 friend:

class Secret
{
  ~Secret() { }
  friend class SecretDeleter;
  friend void SecretDelFunc(Secret *);
};

class SecretDeleter
{
public:
  void operator()(Secret * p) { delete p; }
};

void SecretDelFunc(Secret * p) { delete p; }

std::shared_ptr<Secret> sp1(new Secret, SecretDeleter());
std::shared_ptr<Secret> sp2(new Secret, SecretDelFunc);

关于c++ - 如何从 shared_ptr 调用私有(private)析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8202530/

相关文章:

c++ - 删除 C++ STL multimap 中特定键的条目

c++ - 分配给函数调用返回的指针

c++ - 使用指针 vector 矩阵调用对象的析构函数时程序崩溃

c++ - 识别标识符不工作的派生类

c++ - 模棱两可的调用(从 char* 到 lambda 与 std::string 的转换)

c++ - 为 cv::Mat 设置深度

c++ 析构函数在程序结束前调用

c++ - V8 回调,用数字代替字符串

c++ - 将命令添加到与两个类的公共(public)方法关联的实例管理器

C++:破坏静态内容的最佳方式