zoukankan      html  css  js  c++  java
  • C++智能指针实现

    #include <iostream>
    #include <string>
    #define unsigned int size_t 
    using namespace std;
    
    // 未考虑线程安全
    template<typename FriendClass, typename DataType>  
    class RefCount{
    private:
    	DataType * IPtr;
    	size_t count;	
    
    	RefCount(DataType * p):IPtr(p),count(0){
    		print("构造函数");
    	}
    
    	~RefCount(){
    		print("析构函数");
    		delete IPtr;
    		IPtr = NULL;
    	}
    
    	void increaseOne(){
    		this->count ++;
    	}
    	void decreaseOne(){
    		this->count --;
    	}
    	void print(string info){
    		cout << "RefCount:"<<info<<"  Refcount:"<<count<<endl;
    	}
    	friend   FriendClass;
    };
    
    template<typename DataType>
    class SmartPtr{
    private:
    	RefCount<SmartPtr,DataType> * ptr;
    public:
    	SmartPtr(  DataType * p):ptr(new RefCount<SmartPtr,DataType>(p)){
    		ptr->increaseOne();
    		print("构造函数");
    	}
    	SmartPtr(const SmartPtr& rhs):ptr(rhs.ptr){
    		ptr->increaseOne();
    		print("复制构造函数");
    	}
    	SmartPtr & operator =(const SmartPtr & rhs){
    		if(this == &rhs) return *this; 
    		set(rhs.ptr);	
    		print("赋值操作符函数");
    		return *this;
    	}
    	DataType & operator *(){
    		return * (ptr->IPtr);
    	}
    	DataType * operator ->(){
    		return ptr->IPtr;
    	}
    	DataType * getPtr(){
    		return ptr->IPtr;
    	}
    	DataType getValue(){
    		return *(ptr->IPtr);
    	}
    	void setPtr(DataType * newPtr){
    		if(newPtr == NULL) return;
    		this->set(new RefCount<SmartPtr,DataType>(newPtr));
    	}
    	void setValue(DataType  newValue){
    		*(ptr->IPtr) = newValue;
    	}
    	~SmartPtr(){
    		print("析构函数");
    		reset();
    	}
    	void print(string info){
    		cout << "SmartPtr:"<<info<<" Value: "<<*(ptr->IPtr)<<" RefCount:"<<ptr->count<<endl;
    	}
    
    private:
    	void set(RefCount<SmartPtr,DataType> * newPtr){
    		reset();
    		ptr =  newPtr;
    		ptr->increaseOne();
    	}
    	void reset(){
    		ptr->decreaseOne();
    		if(ptr->count == 0)  
    			delete ptr;
    		ptr=NULL;
    	}
    
    };
    
    
    int main()
    { 
    	//测试普通构造函数
    	{
    		SmartPtr<int> sp(new int(1));
    		/* 输出
    RefCount:构造函数  Refcount:0
    SmartPtr:构造函数 Value: 1 RefCount:1
    SmartPtr:析构函数 Value: 1 RefCount:1
    RefCount:析构函数  Refcount:0
    		*/
    	}
    	//测试复制构造函数
    	{
    		SmartPtr<int> sp(new int(2)); 
    		SmartPtr<int> sp1(sp);
    		/*输出
    RefCount:构造函数  Refcount:0
    SmartPtr:构造函数 Value: 2 RefCount:1
    SmartPtr:复制构造函数 Value: 2 RefCount:2
    SmartPtr:析构函数 Value: 2 RefCount:2
    SmartPtr:析构函数 Value: 2 RefCount:1
    RefCount:析构函数  Refcount:0
    		*/
    	}
    
    	// 测试赋值操作符
    	{
    		SmartPtr<int> sp(new int(3)),sp1(new int(4)); 
    		sp = sp1;
    	/* 输出
    RefCount:构造函数  Refcount:0
    SmartPtr:构造函数 Value: 3 RefCount:1
    RefCount:构造函数  Refcount:0
    SmartPtr:构造函数 Value: 4 RefCount:1
    RefCount:析构函数  Refcount:0
    SmartPtr:赋值操作符函数 Value: 4 RefCount:2
    SmartPtr:析构函数 Value: 4 RefCount:2
    SmartPtr:析构函数 Value: 4 RefCount:1
    RefCount:析构函数  Refcount:0
    	*/
    	}
    	//测试* ->操作符
    	{
    		SmartPtr<string> sp( new string("helloworld"));
    		cout << *sp <<endl;
    		sp->append(" 你好!");
    		cout << sp->c_str()<<endl;
    		*sp = "哈哈哈";
    		cout << sp.getValue()<<endl;
    		/*输出
    RefCount:构造函数  Refcount:0
    SmartPtr:构造函数 Value: helloworld RefCount:1
    helloworld
    helloworld 你好!
    哈哈哈
    SmartPtr:析构函数 Value: 哈哈哈 RefCount:1
    RefCount:析构函数  Refcount:0
    		*/
    	}
    	//其他函数测试
    	{
    		SmartPtr<int> sp(new int(5));
    		cout << *(sp.getPtr())<<endl;
    		sp.setPtr(new int(6));
    		cout <<sp.getValue()<<endl;
    		sp.setValue(7);
    		cout << *sp<<endl;
    /*输出
    RefCount:构造函数  Refcount:0
    SmartPtr:构造函数 Value: 5 RefCount:1
    5
    RefCount:构造函数  Refcount:0
    RefCount:析构函数  Refcount:0
    6
    7
    SmartPtr:析构函数 Value: 7 RefCount:1
    RefCount:析构函数  Refcount:0
    */
    	}
    	// 内存泄露测试
    	{
    		while(true){   //在任务管理器中观察内存占用情况
    			int *p = new int(3);
    			int *q =new int(4);
    
    			SmartPtr<int> sp1(p);
    			SmartPtr<int> sp3=sp1;
    			sp3.setPtr(q);
    			SmartPtr<int> sp4=sp3;
    			SmartPtr<int> sp5(new int(5));
    			sp1= sp5;
    			sp3=sp5;
    			sp4=sp5;
    			sp5.setPtr(new int(6));		
    			int * pi = new int(8);
    			SmartPtr<int> *spa= new SmartPtr<int>(pi);
    			SmartPtr<int> *spb = new SmartPtr<int>(*spa);
    			SmartPtr<int> *spc = new SmartPtr<int>(*spb);
    			delete spa;
    			delete spb;
    			delete spc;	 	
    
    		}
    
    	}
    
    
    }
    

      

    参考文献 http://blog.csdn.net/ishallwin/article/details/4533145

  • 相关阅读:
    广州数控系统数据采集进行中,广数
    heidainhen 海德汉 数据采集
    新代 SYNTEC 数据采集实战
    马扎克MAZAK免授权数据采集
    西门子数控,已授权的机器,可用OPC UA的方式来采集,数据很丰富。
    打破局限,西门子数控免授权数据采集实战
    三合一 DNC系统,(fanuc 三菱 兄弟),(上传,下发,删除)NC程序.
    批量删除多个相同格式内容的Excel表格的列
    批量将多个相同Excel表格内容合并到一个Excel表格的sheet工作簿当中。
    Excel2010表格内容被加密,无法编辑内容。
  • 原文地址:https://www.cnblogs.com/gaoyanqing/p/4736173.html
Copyright © 2011-2022 走看看