答案:该shared_ptr通过引用计数管理对象生命周期,构造时初始化计数,拷贝时递增,析构或赋值时递减,计数为零则释放资源。

实现一个简单的 shared_ptr,核心是模拟引用计数机制,确保多个指针共享同一块内存时,只有当最后一个指针释放时才真正删除对象。下面是一个简化但可运行的 shared_ptr 实现,帮助理解其原理。
基本结构设计
我们需要一个控制块来保存:
- 实际对象的指针
- 引用计数(记录有多少 shared_ptr 指向该对象)
每个 shared_ptr 对象持有指向这个控制块的指针,而不是直接管理原始指针。
立即学习“C++免费学习笔记(深入)”;
templateclass SharedPtr { private: T* ptr_; // 指向实际对象 int* ref_count_; // 指向引用计数 void release() { if (ref_count_ && --(*ref_count_) == 0) { delete ptr_; delete ref_count_; ptr_ = nullptr; ref_count_ = nullptr; } }public: // 构造函数:接管原始指针 explicit SharedPtr(T* ptr = nullptr) : ptr_(ptr), refcount(ptr ? new int(1) : nullptr) {}
// 拷贝构造函数 SharedPtr(const SharedPtr& other) : ptr_(other.ptr_), ref_count_(other.ref_count_) { if (ref_count_) { ++(*ref_count_); } } // 赋值操作符 SharedPtr& operator=(const SharedPtr& other) { if (this != &other) { release(); // 释放当前资源 ptr_ = other.ptr_; ref_count_ = other.ref_count_; if (ref_count_) { ++(*ref_count_); } } return *this; } // 析构函数 ~SharedPtr() { release(); } // 解引用 T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } // 获取原始指针 T* get() const { return ptr_; } // 判断是否为空 bool is_null() const { return ptr_ == nullptr; } // 获取引用计数(用于调试) int use_count() const { return ref_count_ ? *ref_count_ : 0; }};
关键点说明
引用计数共享:所有指向同一对象的 shared_ptr 实例共享同一个引用计数。拷贝时只增加计数,不复制对象。
release 函数:在析构或赋值前调用,减少计数并判断是否需要释放资源。
自赋值保护:赋值操作中检查 this != &other,防止自我赋值导致错误释放。
使用示例
#includestruct MyClass { MyClass() { std::cout << "构造\n"; } ~MyClass() { std::cout << "析构\n"; } };
int main() { { SharedPtr
p1(new MyClass); std::cout << "引用计数: " << p1.use_count() << "\n"; { SharedPtrzuojiankuohaophpcnMyClassyoujiankuohaophpcn p2 = p1; std::cout zuojiankuohaophpcnzuojiankuohaophpcn "引用计数: " zuojiankuohaophpcnzuojiankuohaophpcn p1.use_count() zuojiankuohaophpcnzuojiankuohaophpcn "\n"; } // p2 析构,计数减1 std::cout zuojiankuohaophpcnzuojiankuohaophpcn "引用计数: " zuojiankuohaophpcnzuojiankuohaophpcn p1.use_count() zuojiankuohaophpcnzuojiankuohaophpcn "\n"; } // p1 析构,对象被删除 return 0;}
输出:
构造
引用计数: 1
引用计数: 2
引用计数: 1
析构改进空间
工业级 shared_ptr 还需考虑:
- 线程安全:引用计数增减需原子操作
- 支持自定义删除器(deleter)
- weak_ptr 配合避免循环引用
- 控制块与对象内存合并优化(如 enable_shared_from_this)
但上述实现已涵盖 shared_ptr 最核心的引用计数管理逻辑。
基本上就这些。理解了这个简单版本,再看标准库实现会更容易。










