我确实从库调用接收到shared_ptr,并将它和一些资源传回库中。只有在shared_ptr删除其指针时才能删除该资源:
std::ofstream* out = new std::ofstream();
...
shared_ptr<Lib::SomeClass> writer = Library.createWriter(out);
Library.appendWriter(writer);
图书馆希望我能够管理*,但不会告诉我这样做是否安全。基本上,如果out
被释放,我希望删除writer
。
这可以使用boost的删除工具来实现吗?想法?
答案 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
。