1、与shared_ptr不同。某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。
2、unique_ptr初始化必须采用直接初始化的的形式:unique_ptr
unique_ptr
3、unique_ptr拥有它所指向的对象,因此unique_ptr不支持普通的拷贝和赋值:
unique_ptr
unique_ptr
unique_ptr
p3 = p2 ; //错误,不支持赋值
4、不能普通拷贝、但可以通过release或reset将指针的所有权从一个(非const)unique_ptr转移给另一个unique
unique_ptr
unique
unique
p2.reset(p3.release());//将所有权从p3转移给p2。reset释放了p2原来指向的内存
5、unique_ptr常用操作:
unique_ptr
unique_ptr
unique_ptr
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
weak_ptr
9、weak_ptr常用 操作
weak_ptr
weak_ptr
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