如何从shared_ptr调用私有析构函数?

时间:2011-11-20 15:27:41

标签: c++ pointers destructor shared-ptr friend

我有一个resource_manager类,内部维护std::vector<boost::shared_ptr<resource> >resource_managerresource的朋友类。我希望resource仅由resource_manager创建/删除,因此我将其构造函数设为私有(可正常工作)。

但是,如果我将析构函数设为私有,则代码不会编译,因为析构函数是由boost::shared_ptr调用的,resource不是const resource*的朋友。我想通过仅从resource_manager仅返回shared_ptr来强制执行“不要删除客户端”规则,但不知何故我对此方法提供的安全性不满意(如果客户端以某种方式发生,该怎么办?跨越指向非const的指针?)

除了不使用{{1}}的明显解决方案之外,您是否有解决方案/更好的解决方案?

2 个答案:

答案 0 :(得分:11)

您可以将自定义删除器传递给共享指针。因此,只需创建一个删除函数或函数(由您决定),而该函数又是您班级的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);

答案 1 :(得分:1)

也许宣称shared_ptr<resource>为朋友? shared_ptr不会调用构造函数,并且只应破坏资源管理器是否在所有客户端销毁其shared_ptrs之前释放指针。这将不允许客户端破坏保护,但允许客户端保持资源对resource_manager的“遗嘱”保持活跃。