C++11引入智能指针解决内存管理问题,unique_ptr独占所有权并自动释放资源,shared_ptr通过引用计数实现共享所有权,weak_ptr打破循环引用,推荐使用make_unique和make_shared创建智能指针以提升安全性。
在 C++ 中,手动管理内存容易引发内存泄漏、重复释放等问题。为了解决这些问题,C++11 引入了智能指针,主要包括 std::unique_ptr 和 std::shared_ptr,它们能自动管理动态分配的对象生命周期,确保资源安全释放。
std::unique_ptr 表示对对象的独占所有权,同一时间只能有一个 unique_ptr 指向某个对象。当 unique_ptr 被销毁时,它所管理的对象也会被自动删除。
使用场景:当你需要动态分配对象且不希望多个指针共享该对象时,应优先使用 unique_ptr。
基本用法:
#include#include int main() { auto ptr = std::make_unique (42); std::cout << *ptr << "\n"; // 输出 42 // 移动所有权 auto ptr2 = std::move(ptr); // 此时 ptr 为空,ptr2 拥有对象 return 0; } // ptr2 离开作用域,自动 delete
std::shared_ptr 实现引用计数机制,多个 shared_ptr 可以共享同一个对象。只有当最后一个 shared_ptr 被销毁时,对象才会被释放。
使用场景:多个模块或函数需要共享同一个对象时使用。
基本用法:
#include#include void use_ptr(std::shared_ptr p) { std::cout << "引用计数: " << p.use_count() << "\n"; } int main() { auto sptr = std::make_shared
(100); std::cout << "初始引用计数: " << sptr.use_count() << "\n"; { auto sptr2 = sptr; // 引用计数 +1 std::cout << "复制后引用计数: " << sptr.use_count() << "\n"; use_ptr(sptr2); // 再次增加临时引用 } // sptr2 销毁,引用计数 -1 return 0; } // sptr 销毁,引用计数归零,释放内存
当两个 shared_ptr 相互持有对方时,会导致引用计数无法归零,形成内存泄漏。这时应使用 std::weak_ptr 打破循环。
weak_ptr 不增加引用计数,只是一个“观察者”,访问前需检查对象是否还存在。
#includestruct Node { std::shared_ptr parent; std::weak_ptr child; // 避免循环引用 }; auto node1 = std::make_shared (); auto node2 = std::make_shared (); node1->child = node2; node2->parent = node1; // 形成父子关系,但 child 是 weak_ptr // 正常析构,不会泄漏
基本上就这些。合理使用 unique_ptr 和 shared_ptr,配合 make_unique / make_shared,能极大提升代码安全性与可维护性。注意避免裸 new/delete,优先让智能指针接管资源管理。
# node
# ai
# c++
# ios
# stream
# 作用域
# red
# 循环
# 指针
# delete
# 对象
# 多个
# 动态分配
# 也会
# 零时
# 才会
# 当你
# 推荐使用
# 只是一个
# 主要包括
# 为空
相关文章:
建站之星如何快速更换网站模板?
北京网站制作网页,网站升级改版需要多久?
建站主机与虚拟主机有何区别?如何选择最优方案?
建站之星Pro快速搭建教程:模板选择与功能配置指南
已有域名和空间如何快速搭建网站?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
内网网站制作软件,内网的网站如何发布到外网?
高防服务器租用如何选择配置与防御等级?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
如何在阿里云完成域名注册与建站?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
北京制作网站的公司,北京铁路集团官方网站?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何设计高效校园网站?
南京网站制作费用,南京远驱官方网站?
C#如何在一个XML文件中查找并替换文本内容
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
c# 服务器GC和工作站GC的区别和设置
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
如何快速搭建支持数据库操作的智能建站平台?
微信小程序 五星评分(包括半颗星评分)实例代码
已有域名和空间如何搭建网站?
如何在搬瓦工VPS快速搭建网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
如何用腾讯建站主机快速创建免费网站?
如何在阿里云虚拟主机上快速搭建个人网站?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
C++用Dijkstra(迪杰斯特拉)算法求最短路径
定制建站模板如何实现SEO优化与智能系统配置?18字教程
如何快速上传自定义模板至建站之星?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
javascript基本数据类型及类型检测常用方法小结
建站之星如何实现PC+手机+微信网站五合一建站?
学校建站服务器如何选型才能满足性能需求?
如何快速搭建高效服务器建站系统?
Python路径拼接规范_跨平台处理说明【指导】
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
学校为何禁止电信移动建设网站?
建站之星安装需要哪些步骤及注意事项?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
建站与域名管理如何高效结合?
如何批量查询域名的建站时间记录?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
建站VPS推荐:2025年高性能服务器配置指南
*请认真填写需求信息,我们会在24小时内与您取得联系。