我有一个resource_manager
类,内部维护std::vector<boost::shared_ptr<resource> >
。 resource_manager
是resource
的朋友类。我希望resource
仅由resource_manager
创建/删除,因此我将其构造函数设为私有(可正常工作)。
但是,如果我将析构函数设为私有,则代码不会编译,因为析构函数是由boost::shared_ptr
调用的,resource
不是const resource*
的朋友。我想通过仅从resource_manager
仅返回shared_ptr
来强制执行“不要删除客户端”规则,但不知何故我对此方法提供的安全性不满意(如果客户端以某种方式发生,该怎么办?跨越指向非const的指针?)
除了不使用{{1}}的明显解决方案之外,您是否有解决方案/更好的解决方案?
答案 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的“遗嘱”保持活跃。