0

0

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

幻夢星雲

幻夢星雲

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

|

343人浏览过

|

来源于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++免费学习笔记(深入)”;

  • 传参时用 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,就失去独占语义,后续谁都可能复制它。

小绿鲸英文文献阅读器
小绿鲸英文文献阅读器

英文文献阅读器,专注提高SCI阅读效率

下载

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

事情说清了就结束

相关文章

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

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

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

848

2023.08.22

fclose函数的用法
fclose函数的用法

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

345

2023.11.30

string转int
string转int

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

1091

2023.08.02

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

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

620

2024.08.29

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

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

355

2025.08.29

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

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

235

2025.08.29

lambda表达式
lambda表达式

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

215

2023.09.15

python lambda函数
python lambda函数

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

193

2025.11.08

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

7

2026.03.18

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.5万人学习

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

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