auto_ptr

auto_ptr
智能指针是其指向对象的拥有者,当智能指针被销毁时,对象也被销毁。
一个对象只可能被一个智能指针拥有。


auto_ptr对对象的拥有权

// pass by value
void  TestParaValue(auto_ptr < int >  p)
{
    cout
<<boolalpha<<(NULL==p.get())<<endl;
    cout
<<*p<<endl;
}


// pass by reference
void  TestParaRef( const  auto_ptr < int >&  p)
{
    cout
<<boolalpha<<(NULL==p.get())<<endl;
    cout
<<*p<<endl;
}


// return value
auto_ptr < int >  TestRet()
{
    auto_ptr
<int> pa(new int(5));
    
return pa;
}


int  main()
{
    
{
        auto_ptr
<int> pa(new int(4));                //auto_ptr初始化,pa拥有对象
        cout<<*pa<<endl;

        auto_ptr
<int> pb(pa);                        //auto_ptr初始化,pa将拥有权转交给pb
        cout<<boolalpha<<(NULL==pa.get())<<endl;    //pa里内容为null
        cout<<*pb<<endl;                            //pb拥有对象
        
        auto_ptr
<int> pc = TestRet();                //返回值形式的函数调用,函数内部创建的对象所有权交给pc
        cout<<*pc<<endl;                            //pc拥有对象

        TestParaValue(pb);                            
//传值方式函数调用,pb将拥有权转交给形参,函数返回时形参销毁,对象销毁
        cout<<boolalpha<<(NULL==pb.get())<<endl;    //pb里内容为null
        
        TestParaRef(pc);                            
//传引用方式函数调用
        cout<<boolalpha<<(NULL==pc.get())<<endl;    //pc没有转交拥有权

        auto_ptr
<int> pe;                            //pe内为null    
        
//*pe = 44;                                    //error,向空指针指向的地址赋值

        
const auto_ptr<int> pf(new int (4));        //const auto_ptr
        
//pf = pc;                                    //error, const的auto_ptr所有权不能改变
        *pf = 8;                                    //ok, const的auto_ptr的内容可以改变
    }

    getchar();
    
return 0;
}

auto_ptr的操作
int  main()
{
    
{
        auto_ptr
<int> pa(new int(4));                
        cout
<<*pa<<endl;                            //*操作符返回auto_ptr拥有的对象
        cout<<boolalpha<<(NULL==pa.get())<<endl;    //get()返回对象地址
    
        auto_ptr
<int> pb(pa.release());                //release()放弃对象拥有权,返回对象地址
        cout<<boolalpha<<(NULL==pa.get())<<endl;
        cout
<<*pb<<endl;    
        
        pb.reset(
new int(6));                        //重新设置auto_ptr的内容,删除之前的内容
        cout<<*pb<<endl;

    }

    getchar();
    
return 0;
}

你可能感兴趣的:(auto_ptr)