shared_ptr
- 接受指针参数的构造函数是explicit的,因此不能将内置指针隐式转换为一个智能指针.
- 默认情况下,智能指针必须指向动态内存,为了绑定到其他类型的资源的指针上,必须提供自己的delete操作.
- shared_ptr
p(q, d): p将使用可调用对象d来代替delete.
- shared_ptr
- 不要混用普通指针和智能指针
- shared_ptr可以协调对象的析构,这仅限于自身的拷贝.因此尽量使用make_shared,这样可以防止无意间将同一块内存绑定到多个shared_ptr之上.
- 不要使用get初始化另一个智能指针或为智能指针赋值
- get是为了以下情况设计的:需要向不能使用智能指针的代码传递一个内置指针,使用get返回的指针的代码不能delete.
- reset经常与unique一起使用,来控制多个shared_ptr的共享对象.在改变底层对象之前,使用unique检查我们是否是唯一的所有者,如果不是则制作一份拷贝
- example code:
if(!p.unique()) p.reset(new string(*p)) *p += newVal;
- example code:
- 智能指针和异常
- 函数正常结束或发生了异常,局部对象都会被销毁.
- 智能指针和哑类
- example code:
void f() { connection c = connect(); shared_ptr
p(&c, end_connection); }
- example code:
unique_ptr
- unique_ptr不支持拷贝和赋值
- 可以通过调用release或reset将指针的所有权从一个(非const)unique_ptr转移给另一个unique_ptr.
- 如果我们不用另一个智能指针来管理release返回的指针,则需要手工delete
- 向unique_ptr传递删除器
- unique_ptr管理删除器的方式和shared_ptr不同
weak_ptr
- weak_ptr必须使用lock
- example code:
if(share_ptr
p = wp.lock()) { }
动态数组
- 动态分配一个空数组是合法的
- 此指针保证与任何new返回的指针都不相同,可以做为尾后迭代器.
- 释放
- delete [] pa;
- 智能指针和动态数组
unique_ptr
p(new int[10]); up.release(); - 与unique_ptr不同,shared_ptr不支持管理动态数组,如果希望使用shared_ptr管理动态数组,必须提供自己定义的删除器
- 如果未提供删除器行为是未定义的,因为shared_ptr默认使用delete删除对象
allocator类
将内存分配和对象构造分离
-
allocator类帮助我们将内存分配和对象构造分离开来
-
在早期版本的标准库中,construct只授受两个参数:创建对象的位置和一个类型值,因此只支持拷贝构造.