auto_ptr智能指针

来源:互联网 发布:playmemories mac版 编辑:程序博客网 时间:2024/05/19 01:31

我们通常在一个函数中申请内存和释放内存时是new,delete

比如

void Test(){K* p1(new K);delete p1;}
如果我们假如在delete前过早的return了或者函数结束后都没释放p1;这就引发内存泄漏。

而智能指针,就体现在了它的智能上了,它不用我们去delete,它会等待出了这个作用域会自动调用析构函数自动delete调,它里面有三个成员函数,get(),release(),以及reset()。比较常用。(所在文件<memory>)

p1.release(),就是将该指针置为NULL,但会返回没被NULL前时的指针;

p1.reset(new T(1)),重置,析构delete掉p1所指向的之前对象,new一个新的对象T(1),然后重新分配给p1。

p1.get()返回所指向的指针。

例子在下方,可以复制下来运行观察

template<typename T>void g()  {  // 现在,我们有了一个分配好的对象  T* pt1 = new T;        // 将所有权传给了一个auto_ptr对象  auto_ptr<T> pt2(pt1);        // 使用auto_ptr就像我们以前使用简单指针一样,  *pt2 = 12;          // 就像*pt1 = 12        // 用get()来获得指针的值  assert( pt1 == pt2.get() );        // 用release()来撤销所有权  T* pt3 = pt2.release();        // 自己删除这个对象,因为现在没有任何auto_ptr拥有这个对象  现在pt3=pt1,pt2=NULLdelete pt3;  } //pt2已经被释放掉

void h()  {  auto_ptr<T> pt( new T(1) );  pt.reset( new T(2) );         // 删除由"new T(1)"分配出来的第一个T(2)       T(1)已经被delete掉了 } // 最后pt出了作用域,第二个T也被删除了 

有时间我们为防止内存泄漏我们可以使用异常捕获。

0 0
原创粉丝点击