新闻中心
C++智能指针是什么_C++中unique_ptr与shared_ptr的核心用法解析
答案:C++智能指针通过RAII管理内存,unique_ptr独占资源、不可复制但可移动,高效安全;shared_ptr共享资源,引用计数控制生命周期,适合多所有者场景。

C++智能指针是用于自动管理动态分配内存的类模板,它们通过RAII(资源获取即初始化)机制确保资源在对象生命周期结束时被正确释放,避免内存泄漏。C++标准库提供了三种主要的智能指针:unique_ptr、shared_ptr 和 weak_ptr。本文重点解析 unique_ptr 与 shared_ptr 的核心用法。
unique_ptr:独占式资源管理
unique_ptr 表示对所指向对象的唯一所有权。同一时间只能有一个 unique_ptr 指向特定资源,当 unique_ptr 被销毁或重置时,其所管理的对象会自动被删除。
特点:
GoEnhance
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
- 不支持拷贝构造和拷贝赋值,防止资源所有权被复制。
- 支持移动语义,可通过 std::move 转让所有权。
- 轻量高效,几乎没有运行时开销。
基本用法示例:
#include <memory>
#include <iostream>
std::unique_ptr<int> ptr1 = std::make_unique<int>(42);
// std::unique_ptr<int> ptr2 = ptr1; // 错误:不可拷贝
std::unique_ptr<int> ptr2 = std::move(ptr1); // 正确:移动所有权
if (ptr1 == nullptr) {
std::cout << "ptr1 is null\n"; // 输出此行
}
if (ptr2) {
std::cout << *ptr2 << "\n"; // 输出 42
}
建议使用 std::make_unique 创建对象,它更安全且能避免异常安全问题。
shared_ptr:共享式资源管理
shared_ptr 实现共享所有权,多个 shared_ptr 可以指向同一个对象。它内部使用引用计数来跟踪有多少个 shared_ptr 共享该资源,当最后一个 shared_ptr 被销毁时,对象才会被自动删除。
特点:
- 支持拷贝和赋值,每次拷贝引用计数加1。
- 析构时引用计数减1,为0时释放资源。
- 有轻微运行时开销(控制块和原子操作)。
基本用法示例:
#include <memory> #include <iostream> auto sp1 = std::make_shared<int>(100); std::shared_ptr<int> sp2 = sp1; // 引用计数变为2 std::cout << "ref count: " << sp1.use_count() << "\n"; // 输出 2 sp1.reset(); // sp1 置空,引用计数减1 std::cout << "ref count after reset: " << sp2.use_count() << "\n"; // 输出 1
推荐使用 std::make_shared 创建 shared_ptr,它能提高性能并保证异常安全。
选择合适的智能指针
多数情况下优先使用 unique_ptr,因为它语义清晰、效率高。只有在确实需要共享所有权时才使用 shared_ptr。
常见场景:
- 函数返回动态创建的对象 → 使用 unique_ptr。
- 多个模块需访问同一对象 → 使用 shared_ptr。
- 避免循环引用 → 可配合 weak_ptr 使用(不在本文展开)。
基本上就这些。掌握 unique_ptr 和 shared_ptr 的核心差异和使用方式,能显著提升 C++ 程序的安全性和可维护性。
以上就是C++智能指针是什么_C++中unique_ptr与shared_ptr的核心用法解析的详细内容,更多请关注其它相关文章!
# 中文网
# 大同网站推广代理价格
# 琼海seo公司
# 济南建设网站推广
# 适合学seo的书籍
# 重庆新款seo代运营
# 衡阳资讯网站建设
# 安防设备的营销推广
# 火锅营销推广策划方案模板
# 嘉定网站优化怎么样
# 荣县做推广的网站
# 解决问题
# 三种
# ai
# 相关文章
# 推荐使用
# 才会
# 边缘
# 资源管理
# 多个
# 游戏开发
# red
# 标准库
# stream
# ios
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Go语言中Map值调用指针接收器方法的限制与应对
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
韩小圈电脑版在线入口_网页版免费登录地址
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版
苹果手机如何防止被恶意App追踪
Pandas DataFrame:高效添加条件计算列
Python模块化编程:有效管理依赖与避免循环引用
Golang如何使用const iota_Go iota常量计数器讲解
Django表单提交验证失败后保持字段值不刷新
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
J*aScript生成器_j*ascript异步迭代
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
58动漫网在线官方网 58动漫网正版动漫入口网址
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
Go语言HTML解析:利用Goquery精准获取指定元素内容
J*a 递归快速排序中静态变量的状态管理与陷阱
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
Win11网速慢怎么解决 Win11网络设置优化解除限速
如何更改在 Excel 中打开超链接时的默认浏览器
excel如何生成目录 excel一键生成工作表目录超链接
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
163邮箱登录密码 163邮箱忘记密码找回
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
React Router 嵌套组件中 URL 重定向问题的解决方案
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
J*aScript教程:根据元素文本内容动态设置背景色
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
Python:递归比较文件夹内容并找出特定类型文件的差异
铁路12306官网网页端快速入口 铁路12306官方首页登录教程
妖精动漫免费平台 妖精动漫官网资源观看网址
随机参数递归函数的基准调用次数与时间复杂度探究
C#中解析不规范的HTML为XML 常见的坑与解决办法
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
优化Log4j2控制台输出性能:解决异步日志瓶颈
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法


2025-11-30
浏览次数:次
返回列表