http://blog.csdn.net/rsljdkt/article/details/12223253
1. 智能指针概念
智能指针是基于RAII机制实现的类(模板),具有指针的行为(重载了operator*与operator->操作符),可以“智能”地销毁其所指对象。C++11中有unique_ptr、shared_ptr与weak_ptr等智能指针,可以对动态资源进行管理
2. unique_ptr概念
unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。
unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。
unique_ptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。
3. unique_ptr的基本操作:
4. unique_ptr的使用场景
(1) 动态资源的异常安全保证(利用其RAII特性):
(2) 返回函数内创建的动态资源
(3) 可放在容器中(弥补了auto_ptr不能作为容器元素的缺点)
方式一:
方式二:
(4) 管理动态数组,因为unique_ptr有unique_ptr<X[]>重载版本,销毁动态对象时调用delete[]
5. 自定义资源删除操作(Deleter):
unique_ptr默认的资源删除操作是delete/delete[],若需要,可以进行自定义:
6 auto_ptr与unique_ptr
在C++11环境下,auto_ptr被看做“遗留的”,他们有如下区别:
auto_ptr有拷贝语义,拷贝后源对象变得无效;unique_ptr则无拷贝语义,但提供了移动语义
auto_ptr不可作为容器元素,unique_ptr可以作为容器元素
auto_ptr不可指向动态数组(尽管不会报错,但不会表现出正确行为),unique_ptr可以指向动态数组