【发布时间】:2012-06-27 12:56:36
【问题描述】:
Boost 或其他任何东西是否包含一个容器,其行为类似于共享指针,但允许我控制共享“资源”在其生命周期结束时会发生什么?我想封装一个可以传递但不再需要时可以以上下文定义的方式关闭的对象。
例如,我可能想创建和传递一个文件句柄,知道当它超出范围时,文件将自动关闭,但我不想删除句柄。
我可以自己实现它,但如果框架已经存在,我宁愿不参与 - 毫无疑问有人做得更好。我不能使用boost::shared_ptr,至少不能以正常形式使用,因为资源不应在生命周期结束时被删除。
【问题讨论】:
-
您使用的是哪个版本的 Boost,您说没有
template<class Y, class D> shared_ptr(Y * p, D d);构造函数? -
@SteveJessop:我没有。恐怕我工作的客户不允许 Boost。
-
shared_ptr的 TR1 版本也有。基本上,您最初声明无法使用boost::shared_ptr的原因并不正确。这个客户不允许的新理由更具说服力。如果客户端不允许您使用任何形式的shared_ptr(没有 TR1、没有 Boost、没有 C++11),那么您的问题的答案是“是的,有一个智能指针可以完全按照您想要,但你不能使用它”。 -
@SteveJessop:对不起,鉴于我最初的问题,我可能会更好地限定这个。 (1) 我对 Boost 很感兴趣,因为它是最有可能拥有这样一个容器的框架,但是 (2) 我不能使用 Boost,因为我的客户不允许它,但这并没有阻止我研究如何这是在 Boost 或其他更好地理解它的地方完成的,并且 (3) 我不能使用直接共享指针,因为它会删除超出范围的指针,这不是我想要的但是我承认使用第二个参数(如下)可能是可能的。希望能更好地解释事情。
-
好的,我想我的意思是指定删除器仍然是一个“直接共享指针”,它只是用不同的构造函数构造的。对不起,如果这是一个微不足道的观点。不过,这是一个非常聪明的构造函数:
shared_ptr在删除器上进行类型擦除,这意味着删除器的类型不是shared_ptr的模板参数,只是构造函数的类型。所以你可以传递一个shared_ptr,无论它如何被删除,它都是相同的类型。自己复制所有内容是严肃的 PITA。
标签: c++ boost shared-ptr