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 <memory>
#include <iostream>
int main() {
auto ptr = std::make_unique<int>(42);
std::cout << *ptr << "\n"; // 输出 42
// 移动所有权
auto ptr2 = std::move(ptr);
// 此时 ptr 为空,ptr2 拥有对象
return 0;
} // ptr2 离开作用域,自动 delete
std::shared_ptr 实现引用计数机制,多个 shared_ptr 可以共享同一个对象。只有当最后一个 shared_ptr 被销毁时,对象才会被释放。
使用场景:多个模块或函数需要共享同一个对象时使用。
NoCode
美团推出的零代码应用生成平台
180
查看详情
基本用法:
#include <memory>
#include <iostream>
void use_ptr(std::shared_ptr<int> p) {
std::cout << "引用计数: " << p.use_count() << "\n";
}
int main() {
auto sptr = std::make_shared<int>(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 不增加引用计数,只是一个“观察者”,访问前需检查对象是否还存在。
#include <memory>
struct Node {
std::shared_ptr<Node> parent;
std::weak_ptr<Node> child; // 避免循环引用
};
auto node1 = std::make_shared<Node>();
auto node2 = std::make_shared<Node>();
node1->child = node2;
node2->parent = node1; // 形成父子关系,但 child 是 weak_ptr
// 正常析构,不会泄漏
基本上就这些。合理使用 unique_ptr 和 shared_ptr,配合 make_unique / make_shared,能极大提升代码安全性与可维护性。注意避免裸 new/delete,优先让智能指针接管资源管理。
以上就是C++ 如何使用智能指针 (shared_ptr, unique_ptr)_C++ 智能指针用法与内存管理的详细内容,更多请关注其它相关文章!
# c++智能指针
# node
# ai
# c++
# 内存管理
# 不改变
# 优化网站的意思和作用
# 学院网站栏目统筹建设
# 也会
# 动态分配
# 情况下
# 如何实现
# 第三方
# 微软
# 多个
# 如何使用
# red
# 作用域
# stream
# ios
# 珠海网站关键词优化排名
# 精准营销推广顾问
# seo导航做法
# 彝良seo收费
# 建议网站建设论文范文
# 深圳网站建设咨询公司
# 搜索排名seo矩阵
# seo怎么玩知乎
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
睡觉时心跳快是什么原因 夜间心悸如何应对
在Django中动态检查模型关联:一种灵活的解决方案
《花瓣》创建专辑方法
夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】
Python中对象引用与链表属性赋值的机制解析
解决CSS容器溢出问题:使用calc()实现精确布局与边距控制
Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法
《优志愿》修改手机号方法
Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析
win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】
J*aScript实现下拉菜单驱动的动态表格数据展示
海外搜索引擎推广效果怎么样,怎么分析效果!
在XML中嵌入二进制数据(如图片)的最佳实践是什么? Base64编码与解析注意事项
申通快递物流信息查询 申通快递包裹状态追踪
德邦快递查询入口登录官网 德邦快递单号查询系统入口
实现二叉树的层序插入:基于树大小的路径导航
VS Code中的Tailwind CSS IntelliSense插件使用技巧
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
实现可重用自定义Python Range类
微信步数怎么刷_微信步数快速提升技巧
192.168.1.1路由器后台入口 192.168.1.1默认登录入口
更换小红书群背景怎么换?小红书群规则怎么设置?
Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践
海棠书屋官方在线书籍入口 海棠书屋文学作品浏览官网链接
如何自定义苹果手机铃声
CSS过渡与滚动滚动事件结合应用_scroll与transition动画
向往的生活小游戏启动处_向往的生活小游戏立即启动
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
阿里云共享相册入口在哪
Golang如何操作指针参数_Go pointer参数传递规则
如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐
如何取消数字签名
TikTok视频播放中断怎么办 TikTok播放异常修复方法
猫眼app抢票快还是小程序快
键盘保修需要什么_键盘售后维修流程
微信网页版在线登录 微信网页版在线使用入口
抖音猜你想搜能说明对方搜过吗
《单词速记宝》设置学习计划方法
Bootstrap 5导航栏折叠功能失效:数据属性迁移指南
《美篇》取消会员自动续费方法
vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读
如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成
汽水音乐官方网站登录入口_汽水音乐网页版进入链接
嘴唇干裂起皮怎么办 唇部护理与预防干裂的方法【详解】
126邮箱网页在线登录2025_126邮箱网页版入口官方地址
word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法
谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问
悟空浏览器网页版链接 悟空浏览器网页版最新有效地址
快递查询,一键速查
PySimpleGUI中实现键盘按键与按钮事件绑定教程
2025-11-26
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。