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

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

C++如何手写一个智能指针?C++ RAII与引用计数实现【底层实践】-第1张图片-佛山资讯网

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

裸指针容易忘 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。

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

标签: 字节 ai c++ red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~