我有一个遗留类,其生命周期由引用计数管理(确切地说,它来自ACE_Event_Handler)。
我希望能够在我的代码中使用std :: shared_ptr来管理它,但仍保留旧的遗留引用计数(类的对象需要由不接受shared_ptr的第三方库访问 - 确切地说,ACE。
当引用计数降至0并且管理它的所有shared_ptr实例都被销毁时,必须删除该对象。
我只有一个想法:保持shared_ptr的实例指向该对象,直到引用计数降为0然后重置它。不知何故,这感觉很脏。还有更好的方法吗?
答案 0 :(得分: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()
。