Boost 或其他任何东西是否包含容器将像共享指针一样运行,但允许我控制共享“资源”在其生命周期结束时会发生什么?我想封装一个可以传递的对象,但是当不再需要时可以以上下文定义的方式关闭。
例如,我可能想创建和传递一个文件句柄,知道当它超出范围时,文件将自动关闭,但我不想删除句柄。
我可以自己实现它,但如果框架已经存在,我宁愿不参与 - 毫无疑问有人做得更好。我不能使用boost::shared_ptr
,至少不能以它的正常形式使用,因为资源不应该在生命结束时被删除。
Boost 或其他任何东西是否包含容器将像共享指针一样运行,但允许我控制共享“资源”在其生命周期结束时会发生什么?我想封装一个可以传递的对象,但是当不再需要时可以以上下文定义的方式关闭。
例如,我可能想创建和传递一个文件句柄,知道当它超出范围时,文件将自动关闭,但我不想删除句柄。
我可以自己实现它,但如果框架已经存在,我宁愿不参与 - 毫无疑问有人做得更好。我不能使用boost::shared_ptr
,至少不能以它的正常形式使用,因为资源不应该在生命结束时被删除。
您知道std::shared_ptr
可以使用自定义删除器类吗?这实际上不需要使用“delete”或“free”,但可以很容易地使用某种其他类型的机制(例如引用计数机制release
等)。
这是一个非常简单的例子:
std::shared_ptr<FILE> foo(fopen("la", "r"), fclose);
删除器只需要是一个接受shared_ptr
包装的指针类型的函数。在这种情况下,当foo 超出范围时,shared_ptr
将为您关闭文件。(注意:这不是一个完全明智的实现,因为没有检查错误值。这只是一个示例)。
如果您使用的是支持 C++11 的编译器,则std::shared_ptr
其中一个构造函数采用自定义“删除器”函数。这将允许您编写自己的函数来“释放”资源。
编辑 - 我忘记了 std::shared_ptr 实际上是在 TR1 对 C++ 的更新中,所以如果你的编译器支持 TR1,你应该处于良好状态。
由于您不能使用 Boost 或 std::shared_ptr,因此您可以编写一个智能指针,无论它是共享的还是具有自定义删除器的唯一指针。