智能指针unqiue_ptr

unique_ptr

  unique_ptr 对它指向的对象在同一时刻是独占的。它要么在构造的时候使用内置指针初始化,要么使用reset给其赋值。当unique_ptr被销毁时,它所指向的对象也被销毁。

unique<int> up1;        //默认构造,up1包含一个空指针
unique<int> up2(new int(1));        //使用内置指针初始化up2
unique<int> up4(up2.release());
unique<int> up3(up2); //错误,unique_ptr不支持拷贝 up3 = up2; //错误,unique_ptr不支持赋值 up3 = new int(0) ; //错误,不支持赋值

  unique_ptr特有的操作:

unique_ptr<T> up1 空unique_ptr,可以指向类型为T的对象,up1使用delete来释放它的指针
unique_ptr<T,D> up2 up2将使用一个类型为D的可调用对象来释放它的指针
unique_ptr<T,D> up3(d) 空unique_ptr,指向类型为T的对象,用类型为D的对象d代替delete
up4 = nullptr 释放up4所指向的对象,将up4置为空
up4.release() u放弃对指针的控制权,返回指针,并将u置为空。如果不用另外一个指能指针来保存release的结果,那么要注意使用delete释放它。
up.reset() 释放up指向的对象
up.reset(q) 令up指向内置指针q所指向的对象,up原来指向的对象被释放
up.reset(nullptr) 将up置为空

  unique_ptr不支持拷贝和赋值,但是这一点在函数调和返回上是不成立的。

weak_ptr

  weak_ptr是一种不控制指向对象生存周期的智能指针,它指向一个由shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr上不会改变shared_ptr的引用计数,一旦最后一个shared_ptr被销毁,对象就被释放。即使有weak_ptr指向对象,对象也还是会被释放。

weak_ptr<T> w 空weak_ptr可以指向类型为T的对象
weak_ptr<T> w(sp) 与shared_ptr sp指向相同对象的weak_ptr。T必须能转换为sp指向的类型
w = p p可以是一个shared_ptr或一个weak_ptr。赋值后w与p共享对象
w.reset() 将w置为空
w.use_count() 与w共享对象的shared_ptr的数量
w.expired() 若w.use_count()返回为0,则expired()返回true,否则返回false
w.lock() 如果expired为true,返回一个空shared_ptr;否则返回一个指向w的对象的shared_ptr

   不能直接使用w来访问对象,因为它可能并没有指向对象,此时必须调用lock来判断weak_ptr指向的对象是否存在。

posted on 2018-12-03 17:11  古I月  阅读(200)  评论(0编辑  收藏  举报

导航