【发布时间】:2010-09-17 17:17:51
【问题描述】:
我确实从库调用中收到了一个 shared_ptr,并将它和一些资源传递回库中。资源只有在 shared_ptr 删除其指针时才能被删除:
std::ofstream* out = new std::ofstream();
...
shared_ptr<Lib::SomeClass> writer = Library.createWriter(out);
Library.appendWriter(writer);
图书馆希望我能做到*,但不告诉我什么时候这样做是安全的。本质上,如果writer 被释放,我希望out 被删除。
这可以使用 boost 的删除工具来实现吗?想法?
【问题讨论】:
-
在我看来,createWriter() API 定义的合约应该指定谁拥有stream* 的输入,并暗示它如何以及何时发布。图书馆要么发布它,要么你必须发布它。我认为将其封装在 shared_ptr 中没有帮助,除非 createWriter() 是这样定义的。
-
他们没有指定它,但是从他们的代码中我看到他们希望我拥有它。不幸的是,当他们不再使用它时,他们没有告诉我。这就是为什么它认为等待 shared_ptr 被释放可能是一个可行的解决方案。
-
除非 API 接受 shared_ptr
,否则您将回到原点。将 ofstream 交给图书馆后会发生什么?当不再使用时,它在库代码中是否明显?如果您可以将最终 ofstream 的使用与代码中的 API 使用相关联,则可以确定一个合理的点,假设您可以清理流。 -
附带说明:如果您使用的
Library位于单独的模块 (.dll/.so) 中,那么您的 shared_ptr 删除器应该是匹配的库调用(Library.releaseWriter(writer)或类似的),跨模块边界进行新建/删除是一件非常棘手的事情。 -
谢谢大家!所以我必须与库设计者协商更改他们的接口(没有 releaseWriter 或回调)。我真的会认为 boost 有一种方法可以通知 shared_ptr 被释放。
标签: c++ boost shared-ptr