智能指针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指向的对象是否存在。