gpt4 book ai didi

c++ - 如何同时使用 shared_ptr 和自定义引用计数?

转载 作者:行者123 更新时间:2023-11-30 05:18:17 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com