新闻中心

C++智能指针是什么_C++中unique_ptr与shared_ptr的核心用法解析

2025-11-30
浏览次数:
返回列表
答案:C++智能指针通过RAII管理内存,unique_ptr独占资源、不可复制但可移动,高效安全;shared_ptr共享资源,引用计数控制生命周期,适合多所有者场景。

c++智能指针是什么_c++中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 GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance
  • 不支持拷贝构造和拷贝赋值,防止资源所有权被复制。
  • 支持移动语义,可通过 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切片分割方法 

搜索