new malloc流程
new
new流程
-
调用operator new
-
分配内存:在free store 生成对象
-
free store 可能在 堆 / 自定义的地方
可以认为虚拟内存到物理内存的映射关系早已完成
-
若分配内存失败(内存空间不够),抛出
std::bad_alloc
异常
-
-
调用 构造函数(并生成可能的虚表指针)。
malloc
malloc申请的是虚拟内存,还要再完成缺页才会到物理内存
维护有内存池
- 小于128k
- 通过break从内存池中分配
- free释放后,不一定擦除,会回到内存池中。
- 大于128k
- mmap每次都是系统调用
- free释放后操作系统会立刻回收
向前偏移
- 为了描述分配的大小:多十六个字节的向前偏移
- 所以free时不必知道具体的类型
申请内存失败
- 失败时,默认返回
NULL
空指针,不throw异常 - 必要时可以手动抛出
std::bad_alloc
异常
void *ptr = malloc(size);
if (ptr == nullptr)throw std::bad_alloc();