gpt4 book ai didi

c++ - 如何防止在其他智能指针中存储基于 intrusive_ptr 的类

转载 作者:太空狗 更新时间:2023-10-29 23:37:55 26 4
gpt4 key购买 nike

在工作中,我们有一个基类,我们称它为 IntrusiveBase,它的作用类似于混合,允许将类存储在 boost:intrusive_ptr 中。也就是说,它为其子类提供引用计数并定义 intrusive_ptr_add_ref 和 intrusive_ptr_release 重载。问题是有些人很容易忘记一个特定的子类继承自 IntrusiveBase,然后他们将它存储在其他一些智能指针中,如 scoped_ptr 或 shared_ptr。这是行不通的,因为例如,无论引用计数是多少,scoped_ptr 都会在对象超出范围时将其删除。我们在 ~IntrusiveBase 中断言引用计数为 1,但这并非万无一失,因为通常当 scoped_ptr 超出范围时,最终只会成为原始实例。这留下了一个阴险的失败等待发生那几次引用计数不是

如果有人不小心这样做,有什么方法可以导致编译时失败?即使我必须为每个主要的智能指针类重复做一些事情,也是值得的。

最佳答案

Even if I have to do something repetitively for each of the major smart pointer classes, it would be worth it.

在这种情况下,您可以将它们专门化为您的 InstrusiveBase 继承类型。

  namespace boost
{
template<>
class scoped_ptr<InstrusiveBaseSubclass> { }; // scoped_ptr<InstrusiveBaseSubClass> p(new InstrusiveBaseSubClass) won't compile, neither will p->, p.get() etc.

}

这很烦人,但它可以使用宏,例如:

 class A : InstrusiveBase
{
...
}
NO_SCOPED_PTR(A)
NO_SHARED_PTR(A)

关于c++ - 如何防止在其他智能指针中存储基于 intrusive_ptr 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489992/

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