c++中的unique_ptr智能指针

时间:2021-01-03 19:44:24

1、与shared_ptr不同。某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。

2、unique_ptr初始化必须采用直接初始化的的形式:unique_ptr<double>p1;      //指向一个double类型的unique_ptr

      unique_ptr<int>p2 (new int (42)); //p2指向一个值为42的int

3、unique_ptr拥有它所指向的对象,因此unique_ptr不支持普通的拷贝和赋值:

unique_ptr<string> p1(new string("hello world"));

unique_ptr<string>p2(p1)//错误,不支持拷贝

unique_ptr<string> p3;

p3 = p2 ;  //错误,不支持赋值

4、不能普通拷贝、但可以通过release或reset将指针的所有权从一个(非const)unique_ptr转移给另一个unique

unique_ptr<string> p1(new string("hello world"));

unique<string>p2(p1.release());//p1所有权转移到了p2

unique<string>p3(new string("hello"));

p2.reset(p3.release());//将所有权从p3转移给p2。reset释放了p2原来指向的内存

5、unique_ptr常用操作:

unique_ptr<T> u1       //空unique_ptr,可以指向类型为T的对象。

unique_ptr<T, D> u2   //释放指针,u2会使用一个类型为D的库调用对象来释放指针

unique_ptr<T, D>u(d) //空unique_ptr,指向类型为T的对象,用类型为D的对象来代替delete

u=nullptr ;                     //释放u指向的对象、u置空

u.release()//u放弃对指针的控制权。返回指针并将u置空

u.reset()  //释放u指向的对象、

u.reset(q)  //如果提供了内置指针q,令u指向这个对象;否则将u置为空

u.reset(nullptr)

6、注意release返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。

p2.release()                 //错误,p2不会释放内存,丢失了指针

auto p = p2.release()  //正确,但是需要delete(p)

7、 auto_ptr具有unique_ptr的部分特性,但不是全部。特别是不能在容器中保存auto_ptr,也不能从函数中返回auto_ptr


8、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);//p的引用 计数未改变

9、weak_ptr常用 操作

weak_ptr<T> w           //空weak_ptr指向类型为T的对象

weak_ptr<T> w(sp)//weak_ptr w与shared_ptr sp指向相同的对像

w=p  //p可以是一个shared_ptr或一个weak_ptr

w.reset()  //将w置空

w.use_count()//与w共享对象的shared_ptr的数量

w.expired()//若w.use_count()为0返回true

w.lock()  //如果expired为true,返回一个空shared_ptr.;否则返回一个指向w的对象的shared_ptr