gpt4 book ai didi

c++ - intrusive_ptr 使用基类进行引用计数并包含循环 hell

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:11 25 4
gpt4 key购买 nike

我正在使用 boost::intrusive_ptr 作为我的引用计数智能指针。我正在使用这样的东西:

http://www.codeproject.com/KB/stl/boostsmartptr.aspx#intrusive_ptr%20-%20lightweight%20shared%20pointer

这似乎是个好主意,因为它简化了一个新的引用计数类的声明,只是从它继承。问题来自前向声明。在很多地方我想使用一个指向尚未在类定义中声明的类型的指针,这是不可能的,因为处理引用计数的 2 个方法需要知道该类型是否继承自 CRefCounted。

如果我尝试在声明 intrusive_ptr 之前包含依赖项,那没问题,但随后,我得到了很多循环包含。

您将如何处理这种情况?

最佳答案

我认为您可以使用 intrusive_ptr_add_refintrusive_ptr_release 的模板函数来解决这个问题,如下所示:

namespace boost {
template<class T> void intrusive_ptr_add_ref(T* p) { ++(p->references) }
template<class T>void intrusive_ptr_release(T* p) {
if (--(p->references) == 0)
delete p
}
};

您还需要调整 CRefCounted 中的友元声明,例如

template class<T> friend void ::boost::intrusive_ptr_add_ref(T*);
template class<T> friend void ::boost::intrusive_ptr_release(T*);

使用这些声明,您可以在前向声明的类上使用 intrusive_ptr

class A;
class B {
::boost::intrusive_ptr<A> _myPtr;
};
class A : public CRefCounted {
};

这个解决方案有一个缺点(理论上......),你为 每个 CRefCounted,但我认为编译器无论如何都会选择使用内联,所以这个可以忽略。

关于c++ - intrusive_ptr 使用基类进行引用计数并包含循环 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8671661/

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