我有一个旧类,其生存期由引用计数管理(确切地说,它是从ACE_Event_Handler派生的)。
我希望能够在我的代码中使用std::shared_ptr来管理它,但仍保持旧的旧式引用计数(该类的对象需要由不接受shared_ptr-ACE的第三方库访问。精确)。
当引用计数降至0并且管理该对象的所有shared_ptr实例均被销毁时,必须删除该对象。
我只有一个主意:保留一个指向对象的shared_ptr实例,直到引用计数降至0,然后将其重置。不知何故,这感觉很脏。有没有更好的办法?
最佳答案
通常的方法是使用构造函数中的ACE_Event_Handler::add_ref()
和析构函数中的ACE_Event_Handler::release()
的自定义ptr实现。
或者,您可以将std::unqiue_ptr
与自定义删除程序一起使用:
template<typename T>
struct custom_releaser
{
void operator()(T *p) { if (p) p->release(); }
};
std::unique_ptr<T, custom_releaser<T>> my_ptr;
如果您真的想要
std::shared_ptr
:std::shared_ptr<T> ptr = std::shared_ptr(std::move(my_ptr));
但是,我不知道它是否可以正确调用
ACE_Event_Handler::add_ref()
。我猜想std::shared_ptr
将基于其自身的成员变量进行引用计数-因此,您需要在创建实例和添加引用计数时提供一种执行ACE_Event_Handler::add_ref()
的方法。关于c++ - 如何同时使用shared_ptr和自定义引用计数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41784661/