如何同时使用shared_ptr和自定义引用计数



我有一个遗留类,其生存期由引用计数管理(准确地说,它派生自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()

最新更新