在boost :: shared_ptr完成时释放资源

时间:2010-09-17 17:17:51

标签: c++ boost shared-ptr

我确实从库调用接收到shared_ptr,并将它和一些资源传回库中。只有在shared_ptr删除其指针时才能删除该资源:

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

Library.appendWriter(writer);

图书馆希望我能够管理*,但不会告诉我这样做是否安全。基本上,如果out被释放,我希望删除writer

这可以使用boost的删除工具来实现吗?想法?

2 个答案:

答案 0 :(得分:1)

我不相信您可以直接使用shared_ptr API执行此操作。

如果Lib :: SomeClass是接口/抽象基类,您可以使用Decorator。我们的想法是定义一个子类Lib::SomeClass,包含shared_ptr<Lib::SomeClass>std::ofstream*,并且其方法都转发到包含的shared_ptr的相应方法。然而,装饰器的析构函数会删除包含的ofstream(或者你可以将它存储在某种类型的RAII容器中,如scoped_ptr)。所以它将是你传递给appendWriter的Decorator的一个实例。这是一个草图:

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);

答案 1 :(得分:1)

您可以尝试在范围内创建输出流,该范围的保证时间比writer的任何引用都要长。这取决于你的架构,这是否可行(虽然我认为它应该是一个好的架构)。

如果您有机会与图书馆设计师协商(正如您在评论中提到的那样),请告诉他/她将参数作为参考,如果这足够的话。只有在真正共享对象的所有权时才应使用shared_ptr