一、动态内存与智能指针
1、new:在动态内存中为对象分配空间并返回一个指向该对象的指针;delete:接受一个动态对象的指针,销毁该对象,并释放与之关联的内存
2、两种指针:shared_ptr和unique_ptr;还有一个weak_ptr;都定义在memory中
二、shared_ptr类:智能指针也是模板,需要提供指向的类型
1、一个条件判断中使用智能指针,效果就是检测它是否为空
2、最安全的分配和使用动态内存的方法是调用make_shared的标准库函数
- 返回指向此对象的shared_ptr
- 通常用auto定义一个对象来保存make_shared的结果
auto p = make_shared<int>(42);
3、使用动态内存的原因三个
- 程序不知道自己需要使用多少对象
- 程序不知道需要对象的准确类型
- 程序需要在多个对象间共享数据
4、对动态分配的对象进行初始化通常是个好主意:定义的时候就初始化
5、不能将一个内置指针隐式转换为一个智能指针,必须使用直接初始化形式
shared_ptr<int> p(new int(1024));
6、不要混用普通指针和智能指针,除非我们需要向不能使用智能指针的代码传递一个内置指针
- 比如shared_ptr不支持指针的算术运算,所以为了访问数组中的元素,必须使用get获取一个内置指针,然后来访问数组元素
7、避免智能指针陷阱
- 不适用相同的内置指针值初始化(或reset)多个智能指针
- 不delete get()返回的指针:当智能指针自己被销毁后,自动失效
- 不使用get()初始化或reset另一个智能指针
- 如果使用智能指针管理的资源不是new分配的内存,记住传递给他一个删除器
shared_ptr<connection> p(&c, end_connection);
三、unique_ptr类
1、定义一个unique_ptr时,必须绑定到一个new返回的指针上,且必须采用直接初始化形式
unique_ptr<int> p(new int(42));
2、unique_ptr拥有它指向的对象,因此unique_ptr不支持普通的拷贝或赋值操作,但有两个例外
- 从函数返回一个unique_ptr
- 返回一个局部对象的拷贝
3、可以通过release或reset将指针的所有权从一个非const的unique_ptr转移到另一个unique
4、向unique_ptr传递删除器,必须在尖括号中类型后,提供删除器类型:这里与shared_ptr的删除器不同
unique_ptr<objT, delT> p (new objT, fcn);
四、weak_ptr:将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。最后一个指向对象的shared_ptr被销毁,对象就会释放
- 由于对象可能不存在,所以要使用时,必须调用lock来判断weak_ptr指向的对象是否仍存在
if(shard_ptr<int> np = wp.lock()) { ... }
- w.lock():如果计数为0则返回一个空的shared_ptr;否则返回一个指向w的对象的shared_ptr
五、动态数组
- int *pia = new int[10];
- delete []pia;pia前面必须有[]
时间: 2024-10-11 21:47:07