std::shared_ptr 通过引用计数管理堆对象生命周期,其实现依赖堆上的控制块(Control Block)。
一、控制块结构
控制块通常包含:
- 强引用计数(
shared_count) - 弱引用计数(
weak_count) - 删除器(Deleter)与分配器
使用 std::make_shared 可将对象与控制块一次性分配,减少内存分配次数并提升缓存局部性。
二、循环引用问题
cpp
struct Node {
std::shared_ptr<Node> next;
std::weak_ptr<Node> prev; // 使用 weak_ptr 打破循环
};当两个对象互相持有 shared_ptr 时,引用计数永远无法归零。将其中一方改为 std::weak_ptr,通过 lock() 临时提升为 shared_ptr 访问对象,可安全打破循环。