代码之家  ›  专栏  ›  技术社区  ›  SCFrench

如何防止在其他智能指针中存储基于\u ptr的入侵类

  •  2
  • SCFrench  · 技术社区  · 14 年前

    在工作中,我们有一个基类,我们称之为IntrusiveBase,它的行为类似于mixin,允许类存储在增强:侵入性的ptr。也就是说,它为其子类提供了ref计数,并定义了intrusive\u ptr\u add\u ref和intrusive\u ptr\u release重载。问题是,人们很容易忘记某个特定的子类继承自injectivebase,然后将其存储在其他一些智能指针中,如作用域的\u ptr或共享的\u ptr。这不起作用,因为,例如,当对象超出作用域时,无论引用计数是多少,作用域的\u ptr都会删除该对象。我们在~IntrusiveBase中有一个断言,ref count为1,但这并不是万无一失的,因为通常情况下,当作用域的\u ptr超出作用域时,只会有原始实例。这使得潜在的失败在ref计数为0的那几次等待发生

    2 回复  |  直到 14 年前
        1
  •  6
  •   Logan Capaldo    14 年前

    即使我必须为每个主要的智能指针类重复做一些事情,这也是值得的。

      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)
    
        2
  •  5
  •   Logan Capaldo    14 年前

    另一种选择是重载这些类的new和delete,并将delete设置为private或protected。instrusive的ptr发布可以是一个friend函数或者类似的技术,当ref计数降到零时,可以调用delete。