代码之家  ›  专栏  ›  技术社区  ›  Alex B

没有用于boost::shared ptr的op deallocator

  •  17
  • Alex B  · 技术社区  · 14 年前

    boost中是否有可用于的stock no op deallocator boost::shared_ptr 对于静态物体等。

    我知道写起来非常简单,但是我不想在代码中添加额外的小函数(如果已经有可用的函数的话)。

    6 回复  |  直到 7 年前
        1
  •  10
  •   CashCow    7 年前

    是的,这里有一个:

    #include <boost/serialization/shared_ptr.hpp> // for null_deleter
    
    class Foo
    {
      int x;
    };
    
    Foo foo;
    boost::shared_ptr< Foo > sharedfoo( &foo, boost::serialization::null_deleter() );
    

    当然,需要知道调用的函数不存储共享的ptr以供以后使用,这是一种危险,因为它实际上违反了共享的ptr策略,因为底层对象在共享的ptr的最后一个实例之前保持有效。

        2
  •  3
  •   scjohnno    14 年前

    解决方案使用boost.lambda:

    #include <boost/shared_ptr.hpp>
    #include <boost/lambda/lambda.hpp>
    
    int main()
    {
        int *p = new int(5);
    
        {
            boost::shared_ptr<int> sp(p, boost::lambda::_1);
        }
    
        delete p;
    }
    

    “boost::lambda::u 1”创建一个接受一个参数的空函子。

    不过,你可能会想在里面放一条//comment,让人们知道你为什么这么做。

        3
  •  1
  •   Potatoswatter R. Martinho Fernandes    14 年前

    如果只需要一个额外的引用,这样就不会调用deallocator,这不是更干净吗?(尽管还不是很干净。)

    我不能说boost中没有什么功能可以完成这项工作,但听起来他们并不想包含这些功能。

    编辑: 在阅读了评论和一些文档之后,可以总结为:

    1. 参考泄漏。在某个时刻,执行以下操作:

      new shared_ptr( my_global_shared_ptr );
      

      优点:概念简单。缺点:你在往堆里漏东西。

    2. 自定义释放定位器。自从 shared_ptr 不需要deallocator函数,像另一个答案中提供的匿名身份函数就可以了。

      优点:利用boost,绝对没有开销。缺点:需要一些文档。

    3. 非静态全局对象。如果有一个全球性的 SelddPPTR 对于您的对象,这应该是访问它的唯一方法。用一个 SelddPPTR 初始化者 new my_class . 我认为这是最好的。

        4
  •  1
  •   John Zwinck    13 年前

    boost bug tracker上有一张罚单: https://svn.boost.org/trac/boost/ticket/1913 -很长一段时间没有活动,直到两周前有人低语。

        5
  •  0
  •   MartinP    12 年前

    喂,这是我用的。 我在单元测试中使用它来将本地应用到共享的ptr中。

    // The class NoOp_sptr_Deleter can be used to construct a shared_ptr<>()
    // that will NOT delete the pointee.
    // This can be helpful in unit-testing. Wrapping a local as a shared_ptr.
    // Do take care with the lifetimes though.
    struct NoOp_sptr_Deleter
    {
        void operator()(void const *) const {}
    };
    
    template<typename T>
    boost::shared_ptr<T> FakeSharedPtrFromRef(T& aRef)
    {
        return boost::shared_ptr<T>(&aRef, NoOp_sptr_Deleter() );
    }
    
        6
  •  0
  •   Alexander Shukaev    8 年前