首页  >  文章  >  后端开发  >  尽管类型擦除,“std::shared_ptr”如何保留对象销毁行为?

尽管类型擦除,“std::shared_ptr”如何保留对象销毁行为?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-31 17:40:01593浏览

How Does `std::shared_ptr` Preserve Object Destruction Behavior Despite Type Erasure?

std::shared_ptr;功能揭秘

调查围绕着 std::shared_ptr 令人费解的功能。最初被认为难以置信,但在以下代码片段中观察到的行为引起了怀疑:

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

int main() {
  std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>" << std::endl;
  std::vector<std::shared_ptr<void>> v;
  {
    std::cout << "Creating test" << std::endl;
    v.push_back(std::shared_ptr<test>(new test()));
    std::cout << "Leaving scope" << std::endl;
  }
  std::cout << "Leaving main" << std::endl;
  return 0;
}

代码显示以下输出:

At begin of main.
creating std::vector<std::shared_ptr<void>>
Creating test
Test created
Leaving scope
Leaving main
Test destroyed</code>

理解类型擦除

此行为的关键在于 std::shared_ptr 执行的类型擦除。当初始化一个新实例时,std::shared_ptr 存储一个内部删除器函数。默认情况下,该函数在销毁shared_ptr 时调用delete 运算符。此机制可确保在适当的时间调用所指向对象的析构函数,无论shared_ptr 的类型如何。

强制转换的结果

强制转换 std ::shared_ptr;到 std::shared_ptr;不会改变存储的删除器函数,它仍然引用原始的测试析构函数。因此,当shared_ptr被销毁,仍然调用正确的析构函数,从而产生预期的行为。

标准合规性和未来影响

关于此技术的保证行为,至关重要请注意,std::shared_ptr 的内部实现可能因不同的编译器和平台而异。虽然类型擦除一直是shared_ptrs的一个基本方面,但未来对其实现的更改可能会影响所描述的功能。

因此,不建议仅依赖此行为,并且应在生产代码中避免这种做法。相反,替代方法(例如使用 std::function 或自定义删除器类)更加健壮,并且将在各种实现中提供一致的行为。

以上是尽管类型擦除,“std::shared_ptr”如何保留对象销毁行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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