unique_ptr
一个unique_ptr“拥有”它所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。初始化unqiue_ptr必须采用直接初始化形式:
unqiue_ptr<double> p1; //可以指向一个double的unqiue_ptr
unique_ptr<int> p2(new int(42)); //p2指向一个值为42的int
由于一个unique_ptr拥有它所指向的对象,因此unique_ptr不支持普通的拷贝或赋值操作。但我们可以通过调用release或reset将指针的所有权从一个(非const)unique_ptr转移给unique:
//将所有权从p1(指向string Stegosaurus)转移给p2
unique_ptr<string> p2(p1.release()); //release将p1置为空
unique_ptr<string> p3(new string("Trex"));
//将所有权从p3转移给p2
p2.reset(p3.release()); //reset释放了p2原来指向的内存
release成员返回unique_ptr当前保存的指针并将其置为空。
reset成员接受一个可选的指针参数,令unique_ptr重新指向给定的指针。如果unqiue_ptr不为空,它原来指向的对象被释放。
传递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传递删除器
类似shared_ptr,unique_ptr默认情况下用delete释放它指向的对象。与shared_ptr一样,我们可以重载一个unique_ptr中默认的删除器。
//p指向一个类型为objT的对象,并使用一个类型为delT的对象释放objT对象
//它会调用一个名为fcn的delT类型对象
unique_ptr<objT,delT> p(new objT,fcun);
weak_ptr
weak_ptr是一种不控制所指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象,将一个weak_ptr绑定到一股shared_ptr不会改变shared_ptr的引用计数,一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向对象,对象也会被释放。
auto p=make_shared<int>(42)
weak_ptr<int> wp(p); //wp弱共享p;p的引用计数未改变