标签:include release public null 所有权
//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里面的指针也死了,但指针里面指向的东西没死。
标签:include release public null 所有权
原文地址:http://mingtangduyao.blog.51cto.com/4876371/1719627