内存分类
- 静态内存:
- 类static对象
- 局部static对象
- 定义在所有函数体之外的变量
- 栈内存:函数体内部非 static 变量。
- 堆内存:存放动态分配的对象。
- 静态内存、栈内存、堆内存管理:
- 静态内存和栈内存中的对象,所占用的空间都是由编译器自动的创建和销毁的。
- 堆内存中的对象由我们手动创造,并且需要我们手动delete。
动态内存
- 动态内存管理:
- new
- delete
- 销毁对象;释放内存。
- 动态内存容易引发的问题:
- 内存泄漏
- 空悬指针
智能指针
- 头文件:memory.h
- 无论函数正常处理结束或发生异常,智能指针都能确保资源被释放;
- 使用内置指针管理内存时,若在 new 之后,在 delete 之前发生异常,则内存不会被释放。
- 不要混用普通指针和智能指针。
shared_ptr:允许多个指针指向同一个对象
- 默认初始化:空指针。
- 最安全的分配和使用动态内存的方法:make_shared( args ),可以结合 auto .
- 原理:引用计数。
- 每个 shared_ptr 都又一个关联的计数器。一旦计数器为0,它会自动释放自己所管理的对象。
- shared_ptr 自动销毁所管理的对象,自动释放相关内存。
unique_ptr:独占所指对象
- unique_ptr 不支持普通的拷贝或赋值。
- 例外:可以拷贝或赋值一个即将销毁的 unique_ptr :用于从函数中返回。
weak_ptr:伴随类,弱引用。指向 shared_ptr 所指对象
- weak_ptr 不控制所指向对象的生命周期。
- 将 weak_ptr 绑定到 shared_ptr 上,不改变其引用计数。