本文主要是介绍自己动手实现一个C++智能指针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C++没有提供垃圾回收机制,程序员需要小心翼翼的处理动态内存的分配使用和释放,稍有不慎就会引起悬垂指针内存泄露等问题,尤其在大型程序中出现这种问题往往让人苦不堪言。当然,垃圾回收机制并不是完全没有副作用,引入垃圾回收机制可能会增加程序时间和空间上的开销,同时C++作为一种设计之初就兼容C的语言,在底层开发中被大量使用,实现垃圾回收机制带来的复杂性可能会让C++失去在对性能追求极高的底层,游戏开发等领域中的用武之地。
C++标准库和boost库提供了几种智能指针来帮助我们来管理动态内存的释放,智能指针包含了设计模式中代理模式的思想,智能指针通过运算符重载等方式实现原指针同样的操作接口,使得我们几乎可以像操作正常指针一样操作智能指针,同时智能指针作为一个栈上的对象,在其作用域结束时其析构函数会被自动调用,智能指针在其析构函数里释放原始指针所指向的内存,从而杜绝了内存泄露的问题。
贴出我实现的一份智能指针代码:
// asdfa.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<iostream>
using namespace std;
//引用计数类
class counter
{
public:counter(){}counter(int parCount) :count(parCount){}void increaseCount() { count++; }void decreasCount(){ count--; }int getCount(){ return count; }
private:int count;
};//智能指针
template<class T>
class SmartPointer
{
public:explicit SmartPointer(T* pT) :mPtr(pT), pCounter(new counter(1)){}explicit SmartPointer():mPtr(NULL),pCounter(NULL){}~SmartPointer() //析构函数,在引用计数为0时,释放原指针内存{if (pCounter != NULL){pCounter->decreasCount();if (pCounter->getCount() == 0){delete pCounter;delete mPtr;pCounter = NULL; //将pCounter赋值为NULL,防止悬垂指针mPtr = NULL;cout << "delete original pointer" << endl;}}}SmartPointer(SmartPointer<T> &rh) //拷贝构造函数,引用加1{this->mPtr=rh.mPtr;this->pCounter = rh.pCounter;this->pCounter->increaseCount();}SmartPointer<T>& operator=(SmartPointer<T> &rh) //赋值操作符,引用加1{if (this->mPtr == rh.mPtr)return *this;this->mPtr = rh.mPtr;this->pCounter = rh.pCounter;this->pCounter->increaseCount();return *this;}T& operator*() //重载*操作符{return *mPtr;}T* operator->() //重载->操作符{return p;}T* get(){return mPtr;}
private:T* mPtr;counter* pCounter;
};
int _tmain(int argc, _TCHAR* argv[])
{SmartPointer<int> sp1(new int(10));SmartPointer<int> sp2 = sp1;SmartPointer<int> sp3;sp3 = sp2;return 0;
}
这篇关于自己动手实现一个C++智能指针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!