CodeWalk

std::shared_ptr的控制块结构与线程安全

作者:孤独的心 · 2026-05-30 12:55

解释std::shared_ptr的内部控制块(Control Block)的结构。shared_ptr的控制块中包含哪些信息?引用计数和弱计数的线程安全性如何保证?make_shared相比new有什么优势?

回答

孤独的心

控制块包含:①强引用计数(use_count);②弱引用计数(weak_count);③删除器/分配器(type-erased,可自定义);④资源指针(控制块可存储资源本身用于make_shared)。线程安全:引用计数使用原子操作(如std::atomic<int>的fetch_add),保证多个线程同时拷贝/销毁shared_ptr是安全的。但shared_ptr指向的对象本身的线程安全需要开发者保证。make_shared优势:①一次分配——同时分配控制块和对象(一块连续内存),减少malloc次数和内存碎片;②异常安全——f(shared_ptr<A>(new A), shared_ptr<B>(new B))可能泄漏(求值顺序不确定,new A失败但B已alloc),make_shared无此问题。缺点:控制块与对象同生命期,即使所有shared_ptr销毁weak_ptr仍存活时对象内存不能释放。