讲师中心 微信公众号
AI工具推荐 视频效率加速

c++ 智能指针用法 c++如何使用shared_ptr和unique_ptr

云枫酱_2535

云枫酱_2535

发布时间:2026-03-17 19:24:17

|

403人浏览过

|

来源于php中文网

原创

shared_ptr应优先用make_shared初始化以避免额外内存分配和异常安全问题;unique_ptr不可拷贝只能移动,表示独占所有权;二者混用需谨慎,转换后原unique_ptr为空。

c++ 智能指针用法 c++如何使用shared_ptr和unique_ptr

shared_ptr 初始化必须用 make_shared

直接 new 配合 shared_ptr 构造函数看似可行,但会多一次内存分配,还可能引发异常安全问题。make_shared 把控制块和对象内存一次性分配,更高效也更安全。

常见错误现象:shared_ptr<int>(new int(42))</int> 编译通过,但性能差、异常时可能泄漏;make_shared<int>(42)</int> 才是推荐写法。

  • 不要对裸指针调用 shared_ptr::reset(),容易重复释放
  • 避免循环引用:两个 shared_ptr 互相持有对方,引用计数永远不为 0,得用 weak_ptr 打断
  • make_shared 不支持自定义删除器,需要时才退回到构造函数形式

unique_ptr 不能拷贝,只能移动

这是它和 shared_ptr 最根本的区别——unique_ptr 表示独占所有权,拷贝操作被显式删除。所有传递、返回、赋值都必须用 std::move。

使用场景:函数返回动态对象、容器里存堆对象、RAII 资源封装(比如文件句柄、socket)。

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 传参时用 unique_ptr<t>&&</t> 或直接按值接收(触发移动)
  • 往 vector 里 push,必须写 v.push_back(std::move(p)),否则编译失败
  • 初始化可用 make_unique(C++14 起),比 new 更安全,支持参数转发

shared_ptr 和 unique_ptr 混用要小心类型擦除

把 unique_ptr 转成 shared_ptr 是合法的(通过移动),但反过来不行。一旦转成 shared_ptr,就失去独占语义,后续谁都可能复制它。

典型误用:shared_ptr<t> sp = std::move(up);</t> 后继续用 up —— 此时 up 已为空,解引用必崩。

  • 转换只应在明确放弃独占权、交由共享管理时发生
  • 不要在函数参数里写 shared_ptr<t>(std::move(unique_ptr<t>))</t></t>,可读性差且易出错
  • 注意 shared_ptr 的控制块开销:每个实例额外占用约 16 字节(含引用计数、弱引用计数、删除器等)

自定义删除器写法差异很大

unique_ptr 的删除器是模板参数,影响类型;shared_ptr 的删除器是运行时对象,类型擦除后不参与模板实例化。

这意味着:带不同删除器的两个 unique_ptr 是不同类型,不能赋值;而 shared_ptr 只要指向同类型对象,就能互相赋值,不管删除器是否相同。

  • unique_ptr<file decltype> fp(fopen("x", "r"), &fclose);</file> 删除器类型必须精确匹配
  • shared_ptr<file> sp(fopen("x", "r"), [](FILE* f) { if (f) fclose(f); });</file> 删除器是值语义,可捕获、可 lambda
  • 自定义删除器若抛异常,unique_ptr 析构时直接 terminate,shared_ptr 则不会(但资源可能泄漏)

事情说清了就结束

相关文章

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

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

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

842

2023.11.30

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7179

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3425

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4488

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

3025

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

1111

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

345

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

634

2026.01.05

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn