首页 >后端开发 >C++ >std::shared_ptr 可以用于在关闭时进行可靠的清理吗?

std::shared_ptr 可以用于在关闭时进行可靠的清理吗?

DDD
DDD原创
2024-11-03 08:03:30398浏览

Can std::shared_ptr be used for reliable cleanup at shutdown?

std::shared_ptr:意外的功能

std::shared_ptr,在 C 11 中引入,提供一种管理具有共享所有权的动态分配对象的方法。然而,使用 std::shared_ptr 出现了一个有趣的用例,它用于在关闭时进行任意清理。虽然看似违反直觉,但这种技术提出了有关 std::shared_ptr 的行为和可靠性的基本问题。

工作示例

考虑以下代码片段:

<code class="cpp">#include <memory>
#include <vector>

class Test {
public:
  Test() { std::cout << "Test created" << std::endl; }
  ~Test() { std::cout << "Test destroyed" << std::endl; }
};

int main() {
  std::vector<std::shared_ptr<void>> v;
  {
    v.push_back(std::shared_ptr<Test>(new Test()));
  }
  return 0;
}</code>

令人惊讶的是,此代码输出:

Test created
Test destroyed

这表明 Test 对象已被正确销毁,即使它由 std::shared_ptr 保存。

底层机制

std::shared_ptr 提供类型擦除,将托管对象的类型与实现分离。在内部,它存储了一个删除器函数,该函数根据原始对象的类型调用适当的析构函数。

当 std::shared_ptr;被复制到 std::shared_ptr 时,删除器函数保持不变。在我们的示例中,存储删除器负责调用测试析构函数。

标准合规性和可靠性

虽然所描述的行为当前有效,但它依赖于实现细节,并且C 标准不保证。这是由于两个原因:

  • 类型擦除:如果将来实现发生变化,shared_ptr 内部类型的解耦可能会导致意外的行为。
  • 删除函数: std::shared_ptr 的实现并没有义务为 void* 实现删除函数。

因此,使用 std::shared_ptr 就可以了。任意清理可能是一种有风险的做法,不建议用于可靠的代码。

以上是std::shared_ptr 可以用于在关闭时进行可靠的清理吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn