CodeWalk

unique_ptr与weak_ptr用法及区别

作者:我还是少年 · 2026-05-30 12:55

请说明std::unique_ptr和std::weak_ptr的特性、典型用法、与shared_ptr的区别,以及unique_ptr的移动语义和make_unique的优势。

回答

我还是少年

unique_ptr:

  • 独占所有权,不可拷贝,只能移动(move语义)。
  • 通过make_unique创建(C++14),异常安全,更简洁。
  • 可作为函数返回值传递所有权,或作为参数需要语义明确的所有权转移时。
  • 支持自定义删除器(模板参数)。
  • 底层开销与裸指针相当。

weak_ptr:

  • 配合shared_ptr使用,不增加引用计数(弱引用)。
  • 用于观察shared_ptr管理的对象,需通过lock()返回shared_ptr才能访问。
  • 解决循环引用。
  • 结合expired()检查对象是否已被释放。

区别总结: | 特性 | unique_ptr | shared_ptr | weak_ptr | |------|-----------|-----------|---------| | 所有权 | 独占 | 共享 | 无 | | 拷贝 | 禁止(仅移动) | 允许(计数+1) | 允许(弱计数+1) | | 开销 | 几乎无 | 原子操作+控制块 | 控制块弱计数 | | 使用场景 | 明确唯一所有者 | 共享生命周期 | 观察者、破循环 |