知识卡片
弱引用延迟释放内存
内容
make_shared 通常将对象与控制块合并分配。强引用归零会销毁对象,但弱引用仍需要控制块,可能让整块内存直到最后弱引用消失才释放。大对象加长寿命弱缓存时,要区分对象寿命与内存释放时机,而非仅看析构日志。
参考来源
- 位置:《Effective Modern C++》第4章《智能指针》,条款二十一:优先考虑使用 std::make_unique 和 std::make_shared 而非 new(源文件:_epub-src/EPUB/text/ch005.xhtml)
- 结论依据:原文说明控制块存在期间合并分配内存必须保留,并区分对象销毁与内存释放。
- 原始内容:只要 std::weak_ptr s引用一个控制块(即 weak count 大于零),该控制块必须继续存在。只要控制块存在,包含它的内存就必须保持分配。通过 std::shared_ptr 的 make 函数分配的内存,直到最后一个 std::shared_ptr 和最后一个指向它的 std::weak_ptr 已被销毁,才会释放。