new、delete:
- C++操作符
- 堆区内存申请和释放
- 自动计算申请内存大小
- 返回值为具体的数据类型
- 类型安全
- 支持重载,支持构造和析构
- new失败 抛出异常
- delete 需要具体的数据类型
malloc、free:
- C库函数
- 堆区内存申请和释放
- 手动计算分配内存大小
- 返回值为void *
- 类型不安全,可通过C中强制类型转换 int *p = (int*)malloc(2 * sizeof(double))
- 不支持重载,不支持构造和析构
- malloc失败 返回NULL
- free 需要void *
new底层实现:operator new -> 构造函数 -> 返回对象指针
- 调用operator new的标准库函数,分配足够大的内存 保存指定类型的对象
- 执行该类型的构造函数,对成员变量初始化
- 返回指向 新分配并构造后的对象的 指针
delete底层实现:指针指向对象析构 -> operator delete 释放内存
- 对指针 指向的对象 执行析构函数
- 调用 operator delete的标准库函数,释放该对象所用内存
malloc底层实现:
当申请的空间小于128K:调用brk,将堆顶指针 往高地址推,获得新的内存空间
当申请的空间大于128K:调用mmap,在堆和栈之间找一块空闲的内存并分配; mmap在进程的虚拟地址空间中(堆和栈中的 文件映射区)寻找空闲的内存
malloc:给对象分配的是虚拟内存,未对成员变量初始化;
初始化时:发生缺页中断,建立虚拟内存页表与物理内存页表之间的映射关系。
free底层实现:
总结:
相同:都用于内存的 动态申请和释放
不同:1.malloc/free c new/delete c++
2.malloc(sizeof())手动计算分配空间大小, new 自动计算分配空间大小
3.malloc c库函数 new 运算符
4.malloc 不是类型安全 new类型安全
5.new delete可以构造和析构
常问问题:
malloc分配的是物理内存还是虚拟内存?
答:虚拟内存
malloc调用后是否立即得到物理内存?
答:不会 因为malloc调用后并不会对成员变量进行初始化,当初始化时才会发生缺页中断,建立虚拟内存页表与物理内存页表之间的映射关系。
free(void *) 是如何计算要释放的空间大小?
答:malloc 16字节(bytes) + mem; 返回mem首地址,16字节保存内存块的描述信息
free 左偏移 16字节 读取要free的mem大小