C++如何手写一个智能指针?C++ RAII与引用计数实现【底层实践】


智能指针核心是用RAII自动管理堆内存,避免裸指针的内存泄漏与崩溃;引用计数需独立分配内存并原子操作;拷贝/赋值需同步更新计数;重载*、->等运算符以支持指针式访问。

c++如何手写一个智能指针?c++ raii与引用计数实现【底层实践】

智能指针核心要解决什么问题

裸指针容易忘 delete、重复 delete、提前释放,导致内存泄漏或崩溃。手写智能指针本质是用对象生命周期(构造/析构)自动管理堆内存——这就是 RAII(Resource Acquisition Is Initialization)。关键不在“指针像指针”,而在“析构时自动释放资源”。

引用计数怎么存才安全

引用计数不能和托管对象混在一起(否则 new T 无法带计数),也不能单独 new 一个 int(多一次分配,且难保证线程安全)。主流做法是额外分配一块内存,把计数和指针一起存:

  • new char[sizeof(size_t) + sizeof(T*)] 分配原始内存
  • 用 placement new 在前 sizeof(size_t) 字节放引用计数,在后放 T* 指针
  • 析构时先调用 T 的析构函数,再释放整块内存

这样只做一次堆分配,缓存友好,也方便原子操作(比如用 std::atomic_size_t 存计数)。

拷贝和赋值必须同步更新计数

拷贝构造函数和 operator= 不是简单复制指针,而是:增加原对象的引用计数,让新对象共享同一份资源;同时原对象析构或重置时,要递减计数,仅当计数归零才真正 delete。

  • 拷贝构造:++count,ptr = other.ptr
  • 赋值:先对当前对象做“减一并可能 delete”,再 ++other.count,更新 ptr
  • reset():减一并可能 delete,再 new 新对象、计数设为 1

注意 operator= 要自赋值安全(检查 this == &other)。

解引用和成员访问要像原生指针

重载 *-> 是必须的:

  • * 返回 *ptr(不是 ptr 的拷贝,是引用)
  • -> 返回 ptr(让 ptr->func() 可用)
  • 还建议重载 get() 返回原始指针,use_count() 查看计数,operator bool() 支持 if (sp) 判断是否非空

别忘了 const 版本:const T* get() const,T& operator*() const 等,否则 const 对象无法解引用。

基本上就这些。RAII 是骨架,引用计数是血肉,而 operator 重载是让它“用起来像指针”的最后一层封装。不复杂但容易忽略细节,比如计数初始化、析构顺序、线程安全边界——生产环境推荐 std::shared_ptr,但手写一遍能真正看清内存管理的因果链。

以上就是C++如何手写一个智能指针?C++ RAII与引用计数实现【底层实践】的详细内容,更多请关注其它相关文章!


# ai  # 亳州短视频营销免费推广  # 网站开发公众号排名优化  # 空间秒刷赞网站推广  # seo首页标题怎么优化  # 河北商城网站优化软件  # seo优化文章  # 长治推广全网营销联系人  # 网络软件关键词排名  # 而在  # 设为  # 这就是  # 同步更新  # 游戏开发  # 如何实现  # 什么用  # 如何使用  # 数据结构  # 运算符  # red  # c++  # 字节  # 企业seo外包项目  # 安丘市网站建设教程 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 如何使用 composer 和 aop-php 实现 AOP 编程?  汽车之家网页版免费登录_汽车之家官网首页直接进入  t3出行如何使用微信支付  Lar*el 中高效执行多列更新:单次查询实现  《U校园》学生登录入口2025  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  Symfony路由参数转换器:实体存在性验证与错误处理策略  Python中深度嵌套字典与列表的数据提取与条件过滤指南  手机远程连接电脑方法  韩小圈网页版PC端入口 韩小圈网页版官方网站入口  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  《磁力猫》最好用的磁官网  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程  苹果如何下载nanobanana  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  微信网页版在线登录 微信网页版在线使用入口  苹果自助维修计划支持哪些设备机型  快手缓存清理方法  《360浏览器》设置摄像头权限方法  vivo手机视频通话美颜怎么设置_vivo视频通话美颜开启方法  跨语言测试实践:使用Python Selenium测试现有J*a Web项目  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  消除网页顶部意外空白线:CSS布局常见问题与解决方案  《宝可梦大集结》S4冠军之路开始时间介绍  魔法祈幻界兑换码礼包大全  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  Highcharts雷达图径向轴数值标签实现教程  yy漫画登录页面官方入口_yy漫画在线阅读网址入口  Chart.js 教程:自定义插件实现图表与图例间距调整  苹果手机缓存怎么清除_苹果手机缓存如何清除iphone各版本操作步骤  rabbitmq 持久化有什么缺点?  Animex动漫社正版在线入口 Animex动漫社动漫官方观看网  AI图层蒙版怎么用_AI图层蒙版应用技巧与设计实例  J*aScript字符串_Unicode处理  byrutor直接访问入口 byrutor官方游戏库  《下一站江湖2》心法融合技巧  使用Python和NLTK从文本中高效提取名词的实用教程  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  空腹吃苹果好吗 苹果空腹摄入指南  Linux如何优化系统启动流程_Linux启动项优化方案  WooCommerce 新客户订单自动添加管理员备注教程  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  WooCommerce 购物车:始终显示所有交叉销售商品  以下哪一项是古代兵书三十六计中的计谋  三星M34录音变声问题_Samsung M34麦克风调整  小红书网页版怎么进 小红书网页版通用入口  掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析 

 2025-12-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.