细谈C++中的智能指针

      指针是C++语言的灵魂,也就是说想学好C++,就必须学好指针的用法。指针的灵活性给C++程序插上了一双翅膀,使C++程序员可以编写出更加飘逸的代码,但随之而来的则是令人烦躁的内存管理。在使用指针时,内存泄露的问题一直困扰着C++程序员。智能指针的出现使得内存泄露这一棘手的问题得到了相当程度的缓解。

      智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。

 

 

    每当一个新的“智能指针”指向一块“内存地址”的时候,这块“内存地址”对应的“被指向计数器”自增1;每当一个“智能指针”的生命周期结束或者指向其它“内存地址”的时候,这块“内存地址”对应的“被指向计数器”自减1,此时,如果该“被指向计数器”的计数值为0,也就是说不再有任何“智能指针”指向这块“内存地址”时,则将这个“内存地址”释放掉。

下面是我自己编写的一个简单的智能指针。

#include <iostream> using namespace std; // 定义智能指针类 template<class T> class MySmartPointer { public: // 构造函数 MySmartPointer(T obj); // 拷贝构造函数 MySmartPointer(const MySmartPointer<T>& my_sp); // 析构函数 ~MySmartPointer(); // 重载=运算符 MySmartPointer<T>& operator=(const MySmartPointer<T>& my_sp); // 重载->运算符 T * operator->(); // 重载*运算符 T& operator*(); private: T * mData;// 共享数据区 size_t * mReferenceCount;// 共享数据区被引用的次数 }; template<class T> MySmartPointer<T>::MySmartPointer(T obj)//:mData(new T(obj)),mReferenceCount(new size_t(1)) { mData=new T(obj); mReferenceCount=new size_t(1); } template<class T> MySmartPointer<T>::MySmartPointer(const MySmartPointer<T>& my_sp) { ++*my_sp.mReferenceCount; mData=my_sp.mData; mReferenceCount=my_sp.mReferenceCount; } template<class T> MySmartPointer<T>::~MySmartPointer() { if(--*mReferenceCount==0) { delete mData; delete mReferenceCount; } } template<class T> MySmartPointer<T>& MySmartPointer<T>::operator=(const MySmartPointer<T>& my_sp) { ++*my_sp.mReferenceCount; if(--*mReferenceCount==0) { delete mData; delete mReferenceCount; } mData=my_sp.mData; return *this; } template<class T> T * MySmartPointer<T>::operator->() { return mData; } template<class T> T& MySmartPointer<T>::operator*() { return *this; } int main() { MySmartPointer<int> my_sp1(1); MySmartPointer<int> my_sp2(my_sp1); return 0; }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C++,c,delete,语言,reference)