c++智能指针(四)之unique_ptr
来源:互联网 发布:java中间件 pdf 编辑:程序博客网 时间:2024/05/22 00:22
unique_ptr
和shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。
初始化
没有类似make_shared的标准库函数返回一个unique_ptr,需要将其绑定到一个new返回的指针上。
unique_ptr<int> u(new int(1024));
由于unique_ptr拥有它所指向的对象,所以他不支持普通的拷贝和赋值操作。
unique_ptr<int> u(new int(1024));unique_ptr<int> m(u);//错误,unique_ptr不支持拷贝unique_ptr<int> u1;u1 = u;//错误,unique_ptr不支持赋值
虽然我们不能拷贝或者赋值unique_ptr,但是可以通过调用release或者reset将指针的所有权从一个非const的unique_ptr转移给另一个unique;
unique_ptr<int> u(new int(1024));//将所有权从u转移给munique_ptr<int> m(u.release());//release将u置空unique_ptr<int> n(new int(2048));m.reset(n.release());//reset释放了m原来指向的内存,m指向n原来指向的内存
如果我们不用另一个智能指针来保存release返回的指针,我们的程序就负责资源的释放。
u.release();//错误,p2不会释放内存,而我们丢失了指针。auto p = u.release();//正确,但我们必须记得delete(p)
不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或复制一个将要被销毁的unique_ptr。最常见的例子是从函数返回一个unique_ptr:
unique_ptr<int> clone(int p){ return unique_ptr<int>(new int(p));//正确}
还可以返回一个局部对象的拷贝:
unique_ptr<int> clone(int p){ unique_ptr<int> ret (new int(p));//正确 return ret;//正确}
向unique_ptr传递删除器
类似shared_ptr,unique_ptr默认情况下用delete释放它指向的对象。与shared_ptr一样,我们可以重载一个unique_ptr默认的删除器。
unique_ptr<objT,delT> p(new objT,fcn);//p指向一个类型为objT的对象,并使用一个类型为delT的对象释放objT对象。
阅读全文