我有一个遗留类,其生存期由引用计数管理(准确地说,它派生自ACE_Event_Handler)。
我希望能够在我的代码中使用 std::shared_ptr 管理它,但仍然保留旧的遗留引用计数(类的对象需要由不接受 shared_ptr - ACE 的第三方库访问,准确地说)。
当引用计数下降到 0 并且管理该对象的所有 shared_ptr 实例都将被销毁时,必须删除该对象。
我只有一个想法:保留指向对象的 shared_ptr 实例,直到引用计数降至 0,然后重置它。不知何故,这感觉很脏。有没有更好的方法?
正常方法是拥有自己的自定义 ptr 实现,在构造函数中具有ACE_Event_Handler::add_ref()
,在析构函数中具有ACE_Event_Handler::release()
。
或者,您可以将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
将根据它自己的成员变量进行引用计数 - 因此您需要在创建实例和添加 ref 计数时提供一种方法来执行ACE_Event_Handler::add_ref()
。