欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

C++ 智能指针:shared_ptr 控制块与循环引用破解

发表于:|最后更新:|分类:系统编程|阅读:2103 次

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 访问对象,可安全打破循环。