C++ / Boost 共享资源类,用于管理资源生命周期,类似于 shared_ptr。

3
Boost或其他任何东西是否包含一种容器,可以像共享指针一样工作,但允许我控制在其生命周期结束时发生的共享 "资源" 的内容?我想封装一个可以分配的对象,但是当不再需要时,可以以定义的方式关闭。
例如,我可能想要创建和传递文件句柄,知道当它超出范围时,文件将自动关闭,但我不想删除句柄。我可以自己实现它,但如果框架已经存在,我宁愿不涉及其中 - 毋庸置疑,有人做得更好。我不能使用boost :: shared_ptr,至少不是其正常形式,因为资源不应在生命周期结束时被删除。

你所使用的Boost版本是什么,你说这个版本没有 template<class Y, class D> shared_ptr(Y * p, D d); 构造函数? - Steve Jessop
2
TR1版本的shared_ptr也有它。基本上,你最初提到不能使用boost::shared_ptr的原因是不正确的。这个新的原因,即客户端不允许使用,更具有说服力。如果客户端不允许您使用任何形式的shared_ptr(没有TR1,没有Boost,没有C++11),那么对于您的问题,答案是“是的,有一个智能指针完全符合您的要求,但您不能使用它”。 - Steve Jessop
@SteveJessop:抱歉,考虑到我的原始问题,我最好还是澄清一下。(1)我对Boost感兴趣,因为它最有可能拥有这样的容器,但(2)我不能使用Boost,因为我的客户不允许,但这并不妨碍我去研究在Boost或其他地方如何实现它,以更好地理解它,而且(3)我不能使用普通的shared pointer,因为它会在超出作用域时删除指针,这不是我想要的,但是我承认可以使用第二个参数(如下)。希望这样能更好地解释事情。 - Component 10
@Component10:不好意思,如果我误解了的话,C++0x TR1或C++11是否可行?您只是明确排除了boost... - Rook
@Rook:C++11肯定不行。TR1可能是一个选择,但说实话,客户有自己的类似Boost的框架,通常会实现一些非常相似的功能(不要问为什么)。然而,由于我没有被绑定在他们身上,在这种情况下,我的方法是询问现实世界中的人们如何处理这个问题,然后检查他们自己的框架是否实现了类似的东西。如果有,那就好(在这种情况下确实有),如果没有,我可以抱怨他们去实现它。 - Component 10
显示剩余4条评论
3个回答

8
你知道吗,std::shared_ptr可以接受一个自定义的删除器类?这并不需要真正使用"delete"或"free",而是可以轻松地使用其他机制(例如引用计数机制的release等)。
下面是一个非常简单的示例:
std::shared_ptr<FILE> foo(fopen("la", "r"), fclose);

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


正如其他人所指出的那样,Boost实现的shared_ptr也应该可以很好地完成这项工作。 - Rook

3
如果您正在使用支持C++11 std::shared_ptr的编译器,则其中一个构造函数将使用自定义的“删除器”函数。这将允许您编写自己的函数来“释放”资源。
编辑 - 我忘记了std :: shared_ptr实际上是在TR1更新中添加到C ++中的,因此如果您的编译器支持TR1,则应该可以正常使用。

1

由于您无法使用Boost或std::shared_ptr,因此您可以编写一个具有自定义Deleter的智能指针,无论是共享的还是独特的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接