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

C++智能指针有哪些类型 shared_ptr unique_ptr weak_ptr详解

P粉602998670
发布: 2025-07-01 09:19:01
原创
912人浏览过

c++++中的智能指针通过自动管理内存解决手动管理导致的内存泄漏和重复释放问题。1. shared_ptr共享资源所有权,适用多指针共同管理同一资源的场景,但需避免循环引用;2. unique_ptr独占资源所有权,不可复制只能移动,适合单一管理者,性能优于shared_ptr;3. weak_ptr作为shared_ptr的观察者,不增加引用计数,用于解决循环引用或临时访问资源。应优先使用make_shared和make_unique创建智能指针以提高安全性。

C++智能指针有哪些类型 shared_ptr unique_ptr weak_ptr详解

C++中的智能指针主要是为了解决手动管理内存容易出错的问题,比如忘记释放内存导致内存泄漏,或者重复释放同一块内存造成崩溃。常见的智能指针有三种:shared_ptr、unique_ptr 和 weak_ptr。它们各自有不同的使用场景和特点。

C++智能指针有哪些类型 shared_ptr unique_ptr weak_ptr详解

shared_ptr:共享所有权的智能指针

shared_ptr 是一种可以多个指针共享同一块内存资源的智能指针。它内部维护了一个引用计数,当最后一个 shared_ptr 被销毁或重置时,才会真正释放所管理的对象。

C++智能指针有哪些类型 shared_ptr unique_ptr weak_ptr详解
  • 适用场景:当你希望多个对象共同拥有一个资源,且这个资源在所有拥有者都不再需要之后才被释放。
  • 注意事项:要小心循环引用问题,否则可能导致内存无法释放。
  • 基本用法
    • 使用 make_shared() 创建一个 shared_ptr
    • 可以赋值给另一个 shared_ptr,引用计数自动增加
    • 不建议直接使用裸指针构造 shared_ptr,容易出错

举个例子:

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

auto ptr1 = std::make_shared<int>(10);
auto ptr2 = ptr1; // 引用计数变为2
登录后复制

这时候,只有当 ptr1 和 ptr2 都被销毁后,int 所占的内存才会被释放。

C++智能指针有哪些类型 shared_ptr unique_ptr weak_ptr详解

unique_ptr:独占所有权的智能指针

unique_ptr 表示对资源的唯一拥有权。它不能被复制,只能通过移动语义转移所有权。这种方式保证了资源的安全性,避免了多指针同时管理同一资源带来的风险。

  • 适用场景:当你希望某个资源只由一个指针管理,不允许多个指针同时持有。
  • 优点:性能比 shared_ptr 更高,因为没有引用计数开销。
  • 限制:不能复制,只能移动(move)

常见操作:

  • 创建方式通常是 std::make_unique()(C++14起)
  • 如果想转移所有权,必须用 std::move()

例如:

auto ptr1 = std::make_unique<int>(20);
auto ptr2 = std::move(ptr1); // ptr1现在为空
登录后复制

这时,ptr1 已经不再拥有资源,访问它会导致未定义行为。


weak_ptr:配合 shared_ptr 使用的弱引用指针

weak_ptr 并不真正“拥有”资源,它是对 shared_ptr 管理的对象的一种观察者角色。它的存在不会影响引用计数,因此不会阻止资源被释放。

  • 适用场景:解决 shared_ptr 的循环引用问题,或者用于缓存、监听等不需要长期持有资源的场合。
  • 使用方法:通常从 shared_ptr 构造而来,在使用前需要调用 lock() 获取一个临时的 shared_ptr

举个典型用法:

std::shared_ptr<int> sp = std::make_shared<int>(30);
std::weak_ptr<int> wp = sp;

if (auto temp = wp.lock()) {
    // temp是一个有效的shared_ptr,可以安全使用
} else {
    // 对象已经被释放了
}
登录后复制

注意:每次调用 lock() 都会生成一个新的 shared_ptr,所以不要频繁调用。


总结一下使用建议:

  • 如果你只需要一个指针负责资源,用 unique_ptr
  • 如果多个地方都需要用到同一个资源,用 shared_ptr
  • 如果不想影响资源生命周期但又需要访问对象,用 weak_ptr
  • 尽量使用 make_shared 和 make_unique 来创建智能指针,避免裸指针操作

基本上就这些,理解清楚三者的区别和使用场景,就能避免很多内存管理上的坑。

以上就是C++智能指针有哪些类型 shared_ptr unique_ptr weak_ptr详解的详细内容,更多请关注php中文网其它相关文章!

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

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

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

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