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

C++智能指针如何使用?C++ smart pointer用法全解析【现代C++】

尼克
发布: 2025-12-14 11:11:03
原创
193人浏览过
智能指针是现代C++管理动态内存的核心工具,通过RAII自动释放资源避免内存泄漏和悬空指针;std::unique_ptr独占所有权、不可拷贝可移动;std::shared_ptr共享所有权、引用计数管理;std::weak_ptr观察共享对象、打破循环引用;需避免裸指针混用、错误构造及删除器不匹配等常见坑。

c++智能指针如何使用?c++ smart pointer用法全解析【现代c++】

智能指针是现代 C++ 管理动态内存的核心工具,它用对象封装裸指针,自动在合适时机释放资源,从根本上避免内存泄漏和悬空指针。关键不是“要不要用”,而是“怎么选、怎么写、怎么避坑”。

三种智能指针各司其职

std::unique_ptr 表示独占所有权:同一时间只能有一个 unique_ptr 指向某块内存,不可拷贝,但可移动。适合局部资源管理、工厂函数返回、容器中存储独占对象。

  • 初始化推荐用 std::make_unique<t>(args...)</t>(C++14 起),避免裸 new 和异常安全问题
  • 想转移所有权?用 std::move(ptr),原指针自动变为空
  • 需要数组?用 std::unique_ptr<int></int>,析构时自动调用 delete[]

shared_ptr 用于共享所有权

std::shared_ptr 通过引用计数实现多处共享访问。只要还有一个 shared_ptr 指向对象,对象就不会被销毁。适合缓存、观察者、跨模块传递资源等场景。

  • 优先用 std::make_shared<t>(args...)</t> 构造——它把控制块和对象内存一起分配,更高效且异常安全
  • 慎用裸指针构造(如 shared_ptr<int>(new int(42))</int>):可能因 new 成功而 make_shared 失败导致内存泄漏
  • 循环引用?用 std::weak_ptr 打破。比如 A 持有 B 的 shared_ptr,B 也持有 A 的 shared_ptr → 引用计数永不归零 → 内存泄漏

weak_ptr 是 shared_ptr 的“观察者”

std::weak_ptr 不增加引用计数,只观察 shared_ptr 是否还有效。它不能直接解引用,必须先调用 lock() 获得一个临时 shared_ptr,检查是否非空再使用。

千鹿Pr助手
千鹿Pr助手

智能Pr插件,融入众多AI功能和海量素材

千鹿Pr助手 128
查看详情 千鹿Pr助手

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

  • 典型用途:缓存、定时器回调、父子关系中的子持有父的 weak_ptr(避免循环引用)
  • expired() 可快速判断是否已失效,但仍是竞态敏感操作;线程安全场景下建议直接 lock() 后判空
  • weak_ptr 本身线程安全(读写不同 weak_ptr 对象无冲突),但所指向的对象生命周期仍需业务逻辑保障

别踩这些常见坑

智能指针不是万能胶布,误用反而引入新问题:

  • 不要混用智能指针和裸指针管理同一块内存(例如 new 出来后又用 unique_ptr 接管,或 shared_ptr 和 delete 混用)→ 重复释放 UB
  • 避免从 this 获取 shared_ptr:类内直接写 shared_from_this(),而不是 shared_ptr<myclass>(this)</myclass>(后者会新建控制块,引发双重析构)
  • 自定义删除器要匹配:比如用 malloc 分配的内存,就得传 [](void* p) { free(p); },否则默认 delete 会崩
  • 容器里存 shared_ptr 而不是 raw pointer,尤其当对象生命周期不确定时;但若只是临时遍历且确定不延长生命周期,用引用或 const T& 更轻量

基本上就这些。智能指针不是语法糖,而是 RAII 思维的落地。选对类型、用对构造方式、守住所有权边界,内存管理就能既安全又自然。

以上就是C++智能指针如何使用?C++ smart pointer用法全解析【现代C++】的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

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

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