我有一个 resource_manager
维护 std::vector<boost::shared_ptr<resource> >
的类在内部。 resource_manager
是resource
的好友类.我要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/