首页 > 后端开发 > C++ > 正文

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

裘德小鎮的故事
发布: 2025-12-17 16:39:08
原创
228人浏览过
智能指针是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>></:unique_ptr>),避免对象切片,支持多态
  • 类成员为 unique_ptr,把资源管理责任封装进类内部,析构时自动释放
  • 替代裸指针做 RAII 资源句柄(如文件、socket 封装),配合自定义 deleter 可管理任意资源

示例:
  auto p = std::make_unique(42);
  std::vector<:unique_ptr>> 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_ptr<t></t>std::vector;C 风格资源(FILE*、HANDLE)必须配自定义 deleter。shared_ptr 别轻易用于局部短生命周期对象——它比 unique_ptr 重得多,且容易掩盖设计问题。

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

Magic AI Avatars 47
查看详情 Magic AI Avatars

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

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

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

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号