自己实现简单的shared_ptr功能
#include <iostream> using namespace std; template <typename T> class my_shared_ptr{ private: int* count; T* my_ptr; public: explicit my_shared_ptr(T* origin_ptr) { count = new int; my_ptr = origin_ptr; *count = 1; //___________????? } my_shared_ptr(const my_shared_ptr& ptr){ count = ptr.count; (*count)++; my_ptr = ptr.my_ptr; } my_shared_ptr& operator= (const my_shared_ptr& ptr){ //自反性 if (ptr.my_ptr == my_ptr) return my_shared_ptr(nullptr); if (*count == 1) this->~my_shared_ptr(); else (*count)--; my_ptr = ptr.my_ptr; count = ptr.count; (*count)++; return *this; } ~my_shared_ptr(){ delete count; count = nullptr; } }; class A{ private: int a_; public: A(int a = 0) :a_(a){} void show(){ cout << "show:" << a_ << endl; } }; int main(){ A* a_ = new A(); //新对象 my_shared_ptr<A> a1(a_); //a1 引用计数1 my_shared_ptr<A> a2 = a1; //a1,a2 引用计数 2 my_shared_ptr<A> a3(a1); //a1,a2,a3 引用计数 3 //a1->show();// 可选 A* aa_ = new A(); //新对象2 my_shared_ptr<A> a4(aa_); a4 = a1; //a1,a2,a3 ,a4 引用计数4 释放aa_ a2 = a3; //a2,a3 引用计数 不变 } //全部释放
主要关键在于如何存储count计数器,用全局变量开销较大,可采用指针的方式,所以指向相同内存空间的类共享count。