zoukankan      html  css  js  c++  java
  • (原)C++智能指针——释放器(in linux, g++)

    我的记录:

    1.指定了释放器,就不会去直接调用析构函数。因为释放器就一个。不指定的话析构函数就是释放器.

    2.STL智能指针对内置内型的支持不如class:比如shared_ptr<char> s(new char[10]); memset(s, 0x00, 10);//error! 只能memset(s.get(), ....了。

    3. auto_ptr不能指定释放器.

    #include "iostream"
    #include <tr1/memory>
    
    using namespace std;
    using std::tr1::shared_ptr;
    using std::auto_ptr;
    
    class C
    {
    public:
    	C()
    	{ 
    		cout<<"C()"<<endl;  
    		buf = new char[10];
    	}
    	~C()
    	{ 
    		cout<<"~C()"<<endl;  
    		if(buf)
    		{
    			cout<<"~C() delete []buf."<<endl; 
    			delete [] buf;
    		}
    	}
    	static void MyRelease(C * pC)
    	{
    		cout<<"MyRelease()"<<endl;
    		cout<<"MyRelease() delete [] buf."<<endl;
    		delete [] pC->buf;
    		pC->buf = NULL;
    		cout<<"MyRelease() delete C:";
    		delete pC;//call ~C().
    	} 
    
    private:
    	char * buf;
    };
    
    int main()
    {
    	cout<<"std::tr1::shared_ptr<C>:"<<endl;
    	{
    		C * a = new C;
    		shared_ptr<C> shareC(a, C::MyRelease); 
    	}
    	cout<<"<- shared_ptr test ended.\n"<<endl;
    	
    	cout<<"std::tr1::shared_ptr<C> copy test"<<endl;
    	{
    		shared_ptr<C> shareC(new C, C::MyRelease);
    		shared_ptr<C> shareC2 = shareC;
    	}
    	cout<<"<- shared_ptr copy test ended.\n"<<endl;
    
    	cout<<"std::auto_ptr<C>:"<<endl;
    	C * b = new C;
    	auto_ptr<C> autoC(b);
    
    	cout<<"return 0;"<<endl;
    	return 0;
    }
    

     
    $ g++ main.cpp

  • 相关阅读:
    关于pem与ppk格式的密钥的相互转换
    关于linux免密登录的配置及ssh客户端基于私钥文件的登录
    关于yum update和yum upgrade的区别
    Golang文件操作整理
    整理那些用于基本生存的shell命令
    Docker command line 学习笔记
    关于fork
    tips for using shortcuts
    chapter2
    使用MarkDown的编辑器
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/2637498.html
Copyright © 2011-2022 走看看