【问题标题】:C++ / Boost shared resource class for managing resource lifecycle like shared_ptr用于管理资源生命周期的 C++ / Boost 共享资源类,例如 shared_ptr
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 正如其他人所指出的,shared_ptr 的 Boost 实现也应该可以很好地完成这项工作。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多