3

Boost 或其他任何东西是否包含容器将像共享指针一样运行,但允许我控制共享“资源”在其生命周期结束时会发生什么?我想封装一个可以传递的对象,但是当不再需要时可以以上下文定义的方式关闭。

例如,我可能想创建和传递一个文件句柄,知道当它超出范围时,文件将自动关闭,但我不想删除句柄。

我可以自己实现它,但如果框架已经存在,我宁愿不参与 - 毫无疑问有人做得更好。我不能使用boost::shared_ptr,至少不能以它的正常形式使用,因为资源不应该在生命结束时被删除。

4

3 回答 3

8

您知道std::shared_ptr可以使用自定义删除器类吗?这实际上不需要使用“delete”或“free”,但可以很容易地使用某种其他类型的机制(例如引用计数机制release等)。

这是一个非常简单的例子:

std::shared_ptr<FILE> foo(fopen("la", "r"), fclose);

删除器只需要是一个接受shared_ptr包装的指针类型的函数。在这种情况下,当foo 超出范围时,shared_ptr将为您关闭文件。(注意:这不是一个完全明智的实现,因为没有检查错误值。这只是一个示例)。

于 2012-06-27T13:00:38.903 回答
3

如果您使用的是支持 C++11 的编译器,则std::shared_ptr其中一个构造函数采用自定义“删除器”函数。这将允许您编写自己的函数来“释放”资源。

编辑 - 我忘记了 std::shared_ptr 实际上是在 TR1 对 C++ 的更新中,所以如果你的编译器支持 TR1,你应该处于良好状态。

于 2012-06-27T13:00:13.820 回答
1

由于您不能使用 Boost 或 std::shared_ptr,因此您可以编写一个智能指针,无论它是共享的还是具有自定义删除器的唯一指针。

于 2012-06-27T13:41:32.657 回答