知识卡片
同一对象一个控制块
内容
对同一裸指针分别构造多个拥有型 shared_ptr 会产生多个控制块,各自把引用计数减到零后重复销毁对象。共享拥有权应从已有 shared_ptr 或 weak_ptr 派生;裸地址相同不代表控制块相同,见[[shared_ptr控制块]]。
参考来源
- 位置:《Effective Modern C++》第4章《智能指针》,条款十九:对于共享资源使用 std::shared_ptr(源文件:_epub-src/EPUB/text/ch005.xhtml)
- 结论依据:原文明示重复裸指针构造产生独立控制块、独立计数和重复销毁,因果链直接支持本卡。
- 原始内容:这些规则造成的后果就是从原始指针上构造超过一个 std::shared_ptr 就会让你走上未定义行为的快车道,因为指向的对象有多个控制块关联。多个控制块意味着多个引用计数值,多个引用计数值意味着对象将会被销毁多次(每个引用计数一次)。那意味着像下面的代码是有问题的,很有问题,问题很大: