代码之家  ›  专栏  ›  技术社区  ›  Christopher Oezbek

在boost::shared\u ptr终结时释放资源

  •  1
  • Christopher Oezbek  · 技术社区  · 14 年前

    我确实从库调用接收到一个共享的ptr,并将它和一些资源传递回库中。只有当共享指针删除其指针时,才能删除资源:

    std::ofstream* out = new std::ofstream(); 
    ...
    shared_ptr<Lib::SomeClass> writer = Library.createWriter(out);
    
    Library.appendWriter(writer);
    

    out 在下列情况下删除 writer

    这可以通过使用boost的deleter工具来实现吗?思想?

    2 回复  |  直到 9 年前
        1
  •  1
  •   SCFrench    14 年前

    我不相信你能用共享的ptrapi直接做到这一点。

    如果Lib::SomeClass是接口/抽象基类,则可以使用 Decorator . 这样做的目的是定义一个包含子类的类 Lib::SomeClass ,包含 shared_ptr<Lib::SomeClass> 和一个 std::ofstream* ,其方法都转发到包含的共享ptr的相应方法。但是,decorator的析构函数将删除包含的 ofstream scoped_ptr

    class SomeClassDecorator : public Lib::SomeClass
    {
      public:
        SomeClassDecorator(shared_ptr<Lib::SomeClass> p, std::ofstream* stream)
          : p_(p), stream_(stream)
        {}
    
        virtual int MethodOfSomeClass(int x) {
            return p_->MethodOfSomeClass(x);
        }
    
      private:
        shared_ptr<Lib::SomeClass> p_;
        scoped_ptr<std::ofstream> stream_;
    };
    
    std::ofstream* out = new std::ofstream(); 
    ...
    shared_ptr<Lib::SomeClass> writer = Library.createWriter(out);
    shared_ptr<Lib::SomeClass> wrapper(new SomeClassDecorator(writer, out));
    
    Library.appendWriter(wrapper);
    
        2
  •  1
  •   Björn Pollex    14 年前

    您可以尝试在堆栈上创建一个范围内的输出流,该范围保证比任何对 writer . 这取决于您的体系结构,这是否可行(尽管我认为在一个好的体系结构中应该如此)。

    shared_ptr 仅当对象的所有权真正共享时才应使用。