能够保证在离开作用域后对象被自动释放!
1.unique_ptr指针
- 定义
一个unique_ptr”拥有”它所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。当unique_str被销毁时其指向的对象也被销毁。当定义一个unique_ptr时,需要将其绑定到一个new返回的指针上,初始化unique必须采用直接初始化形式,并且由于一个unique_ptr是拥有(也可以理解为独有)它指向的对象,因此unique_ptr不支持普通的拷贝或者赋值操作;
unique_ptr<double> p1;//可以指向一个double的unique_ptr
unique_ptr<int> p2(new int(42));//p2指向一个值为42的int
unique_ptr<int> p3 = p2;//错误!! unique_ptr不支持赋值
unique_ptr<int> p4(p2);//错误!!unique_ptr不支持拷贝
虽然不能拷贝或赋值unique_ptr,但可以通过release或reset将指针的所有权从一个(非const)unique_ptr专一给另一个unique_ptr;
/*将所有权从p1转移给p2*/
unique_ptr<int> p1(new int(666));
unique_ptr<int> p2(p1.release());//release将p1置为空
/*将所有权从p2转移给p3*/
unique_ptr<int> p3;
p3.reset(p2.realse());
release成员返回unique_ptr当前保存的指针并将其置为空。调用release会切断unique_ptr与和它原来管理的对象间的联系,release返回的指针通常用来初始化另一个智能指针或给另一个智能指针赋值。
p2.release();//错误:p2不会释放指针,并且丢失了指针,见《C++primer》P418
auto p = p2.release();//正确,但是必须记得要delete(p)!
- 传递unique_ptr参数和返回unique_ptr
不能拷贝unique_ptr的规则有一个例外,可以拷贝或赋值一个将要被销毁的unique_ptr。最常见的例子就是从函数返回一个unique_ptr:
unique_ptr<int> clone(int p){
//正确:从int*创建一个unique_ptr<int>
return unique_ptr<int>(new int(p));
}
还可以返回 一个局部对象的拷贝:
unique_ptr<int> clone(int p){
unique_ptr<int> ret(new int(p));
return ret;
}
对于上面这两段代码,编译器知道要返回的对象将要被销毁,在此情况下会执行一种特殊的”拷贝”。
- unique_ptr操作
(1) unique_ptr u1;//空unique_ptr,可以指向类型为T的对象,u1会使用delete来释放它的指针;
(2)unique_ptr u2;//空unique_ptr,可以指向类型为T的对象,u2会使用一个类型为D的可调用对象来释放它的指针;
(3)unique_ptr u(d);//空unique_ptr,可以指向类型为T的对象,u2会使用一个类型为D的对象d代替delete;
(4)u = nullptr;//释放u指向的对象,将u置为空;
(5)u.release();//u放弃对指针的控制权,返回指针,并将u置为空;
(6)u.reset();///u放弃对指针的控制权
(7)u.reset(q);//如果提供了内置指针q,令u指向这个对象,否则将u置为空;