侯捷老师-内存管理和内存分配器笔记
目录
-
链接:https://www.youtube.com/watch?v=uQ3wKWGmtk0&list=PLRTJhCIMo8HPlzVfZ8uxs6SGSSAtKXQ6Q
-
所有的内存分配最终都会调用malloc
- glibc就是直接用的DL Malloc
- 调用层次:c++程序员 => 标准库容器std::allocator => 标准c++的operator new() => CRT的malloc和free => 操作系统的HeapAlloc和VirtualAlloc
展开查看
-
4种分配内存的方式
- malloc, new, operator::new(), std::allocator
展开查看
- malloc, new, operator::new(), std::allocator
-
new和delete
- new就是先分配内存,再调用构造函数
delete先调用析构函数,再释放内存- 程序员直接调用构造ctor,需要用placement new
- 内存不足就new失败,程序员可以写new_handler函数对失败后做处理(只能释放或exit了)
- new Object关键字其实是调用了::operator new(sizeof(Object))
- 重载的Object的static operator new一定是静态的
- new Obj[3]和delete[] ptr会构造,析构
展开查看
ptr = new Obj[3] : 唤醒3次构造ctor
delete[] ptr : 唤醒3此析构dtor
内存泄漏发生在dtor上,而不是delete上展开截图
- new就是先分配内存,再调用构造函数
-
标准库内存管理抽象:allocator分配器
-
为一个类写内存池怎么做
1. 要分配100个Object,每个Object为8字节
2. Object类重载operator new函数,每次挖一大块,用嵌入式指针
3. 直接malloc出100个Object的内存,这样cookie少
4. 由于每个类都要做一次"重载operator new","挖一大块内存,用嵌入式指针"所以标准库有了通用的allocator -
标准库帮我们做了通用的内存池
std::alloc截图
- 需要考虑:碎片,战备池,malloc失败后并不会不断除以2而是从已有的上面拿
-
-
标准库的allocator有内存池的概念
- 减少malloc的次数,因为malloc会在头尾带cookie(8字节)
-
展开查看: 一次malloc一大块内存比分几次malloc小内存要好
-
- 减少malloc的次数,因为malloc会在头尾带cookie(8字节)
-
使用标准库容器内存占用会更小(cookie少)