c++11智能指针怎么用 unique_ptr和shared_ptr的使用场景【现代c++】

智能指针是C++11引入的自动内存管理机制,主要含unique_ptr(独占、零开销)和shared_ptr(共享、带引用计数),应优先选unique_ptr,shared_ptr仅用于明确需多方共管的场景。

c++11智能指针怎么用 unique_ptr和shared_ptr的使用场景【现代c++】

智能指针是 C++11 引入的核心特性,用来自动管理动态内存,避免手动 new/delete 带来的泄漏、重复释放和悬挂指针问题。unique_ptrshared_ptr 是最常用的两种,它们语义清晰、开销可控,关键在于按所有权模型选对类型。

unique_ptr:独占所有权,轻量高效

它表示“唯一拥有”堆对象的语义,不能拷贝,只能移动。底层不带引用计数,几乎零开销,适合绝大多数需要动态分配但生命周期明确的场景。

函数返回堆对象时,用 std::make_unique 构造并直接返回,调用方自然接管所有权 容器中存动态对象(如 std::vector>),避免对象切片,支持多态 类成员为 unique_ptr,把资源管理责任封装进类内部,析构时自动释放 替代裸指针做 RAII 资源句柄(如文件、socket 封装),配合自定义 deleter 可管理任意资源

示例:
  auto p = std::make_unique(42);
  std::vector> shapes;
  shapes.push_back(std::make_unique(3.0));

shared_ptr:共享所有权,带引用计数

多个 shared_ptr 可共同指向同一对象,通过引用计数自动管理生存期。适用于真正需要“多方共管”的场景,但要注意循环引用风险和额外开销(控制块内存 + 原子操作)。

对象被多个不相干模块或数据结构同时持有(如观察者模式中的被观察对象) 异步编程中跨线程传递对象所有权(需注意线程安全,引用计数本身是原子的) 缓存系统中,缓存项和使用者共同决定对象是否存活 与 weak_ptr 配合打破循环引用(比如父子节点、观察者-被观察者)

示例:
  auto sp1 = std::make_shared();
  auto sp2 = sp1; // 引用计数+1
  { auto wp = std::weak_ptr(sp1); } // 不影响计数

别混用,也别滥用

不是所有 new 都该套智能指针。对象优先;数组用 std::unique_ptrstd::vector;C 风格资源(FILE*、HANDLE)必须配自定义 deleter。shared_ptr 别轻易用于局部短生命周期对象——它比 unique_ptr 重得多,且容易掩盖设计问题。

立即学习“C++免费学习笔记(深入)”;

记住:unique_ptr 是默认选择;shared_ptr 是特例,得有明确的共享理由。

以上就是c++++11智能指针怎么用 unique_ptr和shared_ptr的使用场景【现代c++】的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1489589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 12:32:06
下一篇 2025年12月19日 12:32:16

相关推荐

发表回复

登录后才能评论
关注微信