//1,release函数只是简单的转移对内存的拥有权,自己变成null,不会delete,一般在将所有权转移给别的智能指针的时候使用。具体可参加源码。 例:


#include <memory>
#include <iostream>
using namespace std;
class A
{
public:
 A(int a):m_na(a)
 {
     cout<<"A cont" <<endl;
 }
 virtual ~A()
 {
     cout<<"A dect"<<endl;
 }

 int m_na;
};


int main(int argc, char *argv[])
{

    std::auto_ptr<A> p(new A(1));
    p.release();//注意 release后,p指向的内存还没被释放。以后也不会释放,存在泄露
                     //所有权转移出去了,只是没有别的智能指针接受而已。
    if(p.get()==NULL)
    {
        cout<<"null"<<endl; //release后,p为null
    }

}


新浪博客以前的旧笔记:

笔记
1:
release :相当于get()后再转移所有权。并没有释放。
例如:
       auto_ptr fb(fa);   // 相当auto_ptr fb(fa.release()); 智能指针赋值时,自动release转移
       if( fa.get()==NULL)
             cout<< "fa null" <<std::endl;  
 
 
 
get()只是获得指针,并没有对象转移。
 
 
2:什么时候用release,什么时候用get()
当有auto_ptr对象接收所有权的时候用release,没有的时候用get();
 
例如:
函数参数为指针,当函数里面有auto_ptr接收参数(指针)所有权的时候。
void A(TWriteStream *p)
{
    std::auto_ptr m_pStream;
    m_pStream.reset( pNext ); //pNext为函数参数传进来的对象。
}
调用此函数的时候:
std::auto_ptr p(new TWriteStream);
A(p.release());
 
2:当类包含一个智能指针,当此类对象析构或此类指针析构的时候,类里面的智能指针自动析构对象。
若类包含的不是智能指针,只是普通指针,则类对象或指针析构的时候,其里面的普通指针已消亡,调用类的其他地方没有释放(要记得在类死的时候释放),则内存泄露。
 
 例如:
class A
{
public:
 A(int a):m_na(a)
 { cout<<"A cont" <<endl;}
 virtual ~A(){ cout<<"A dect"<<endl; }

 int m_na;
};
 
class B :public A
{
public:
 B(int b):A(b)  { cout<<"B cont" <<endl; }
 ~B(){ cout<<"B dect"<<endl; }
};

class F
{
public:
 F(A*a):m_pa(a){ cout<<"f cont" <<endl;}
 ~F(){ cout<<"f dect"<<endl; }
private:
 auto_ptr m_pa;
};

F* createConvert()
{
 auto_ptr pb(new B(2));
 auto_ptr f;
 f.reset(new F( pb.release() ) );
 return f.release(); //有接收,用release()
}//函数调用完后,pb未析构,因为对象已经转移到f里面(相当类F里面),此外,f未析构,因为其已转移到返回值中
void f(F* &b)
{
 auto_ptr fb(createConvert()); //接收
 b = fb.get();   //赋给对象为普通指针,无接收,用get()
 int a=1;
}
 
int main()
{
     F *b =NULL ;
     if(b == NULL)
         cout<<"null"<<endl;
     f(b);  //执行完此句后,f()里的fb析构,追溯到 createConvert()里面的f析构,f析构后,其类里面的智能指针析构
     if(b == NULL)
         cout<<"null"<<endl;
      return 1;
}
 
结果 
 
类里面
protected:
typedef std::list  typeStreamList;
typeStreamList       m_StreamList;
 
类死掉的时候,list也死掉,list里面的指针也死了,但指针里面指向的东西没死。