我有一个旧类,其生存期由引用计数管理(确切地说,它是从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/

10-11 23:21