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

  • 相关阅读:
    Hadoop 最讨厌的报错:运行VirtualBox提示0x00000000错误“0x00000000指令引用的0x00000000内存该内存不能为written?
    linux下面/usr/local和opt目录有何区别
    Hadoop是不是必须在linux上运行?(根本原因是操作系统Linux的权限开放优势)
    Hadoop主要配置文件的作用
    RPC模式
    Hadoop安装最后一步~Hadoop伪分布式配置
    word 使用中遇到的小细节(按空格键后面字不见;从编译器粘贴的代码出现乱码,word标题内容折叠效果实现)
    在VS Code下配置Julia
    使用pandas读取csv文件和写入文件
    ModuleNotFoundError: No module named 'sklearn.cross_validation'
  • 原文地址:https://www.cnblogs.com/gaoyanqing/p/4736173.html
Copyright © 2011-2022 走看看