C++ C++;/Boost共享资源类,用于管理资源生命周期,如共享资源

C++ C++;/Boost共享资源类,用于管理资源生命周期,如共享资源,c++,boost,shared-ptr,C++,Boost,Shared Ptr,Boost或其他任何包含容器的东西是否会像共享指针一样工作,但允许我控制共享“资源”在其生命周期结束时会发生什么?我想封装一个可以传递的对象,但当不再需要时,可以用上下文定义的方式关闭它 例如,我可能想创建并传递一个文件句柄,知道当它超出范围时,文件将自动关闭,但我不想删除该句柄 我可以自己实现它,但如果框架已经存在的话,我宁愿不进入其中——毫无疑问,有人做得更好。我不能使用boost::shared_ptr,至少不能使用它的正常形式,因为资源不应该在生命周期结束时删除。如果您使用的编译器支持C

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

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


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

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

编辑-
我忘记了STD::SyrdY-PTR实际上是在Tr1更新到C++,所以如果编译器支持Tr1,那么你应该是好的。

< P>你知道 STD::SyrdYPPTR< /Cord>可以采用自定义的DELTER类吗?这实际上不需要使用“delete”或“free”,但可以很容易地使用其他类型的机制(例如引用计数机制的
release
等等)

这里有一个非常简单的例子:

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

deleter只需要是一个函数,它采用
shared\u ptr
包装的指针类型。在这种情况下,当NFOO超出范围时,
shared\u ptr
将为您关闭该文件。(注意:这不是一个完全合理的实现,因为没有检查错误值。这只是一个示例)。

由于不能使用Boost或std::shared\u ptr,您可以编写一个具有自定义Deleter的智能指针,无论是共享的还是唯一的

您正在使用哪个版本的Boost,您说它没有共享
模板\u ptr(Y*p,D)构造函数?@SteveJessop:我没有。恐怕我工作的客户不允许Boost。TR1版的
shared\u ptr
也有它。基本上,您最初声明的无法使用
boost::shared\u ptr
的原因是不正确的。这一新的原因,即客户不允许这样做,更加引人注目。如果客户端不允许您使用任何形式的
shared_ptr
(没有TR1,没有Boost,没有C++11),那么您的问题的答案是“是的,有一个智能指针可以完全满足您的需要,但您不被允许使用它”。@SteveJessop:对不起,根据我最初的问题,我可能最好限定一下。(1) 我对Boost感兴趣,因为它是最有可能有这样一个容器的框架,但(2)我不能使用Boost,因为我的客户不允许使用它,但这并不妨碍我研究如何在Boost中实现这一点,或者在任何地方更好地理解它(3)我不能使用直接共享指针,因为它会在超出范围时删除指针,这不是我想要的,但我承认使用第二个参数(如下)可能是可行的。希望这能更好地解释问题。好吧,我想我的观点是,指定删除器仍然是“直接共享指针”,它只是用一个不同的构造函数构造的。对不起,如果这是一个微不足道的观点。这是一个非常聪明的构造函数:
shared\u ptr
对删除器进行类型擦除,这意味着删除器的类型不是
shared\u ptr
的模板参数,而只是构造函数的模板参数。因此,您可以传递一个
shared_ptr
,无论它是如何删除的,它都是相同的类型。自己复制所有这些都是一件严肃的事情。正如其他人所指出的那样,
shared\u ptr
的Boost实现应该也能很好地完成这项工作。