new、delete、malloc、free区别

new、delete:

  • C++操作符
  • 堆区内存申请和释放
  • 自动计算申请内存大小
  • 返回值为具体的数据类型
  • 类型安全
  • 支持重载,支持构造和析构
  • new失败 抛出异常
  • delete 需要具体的数据类型

malloc、free:

  • C库函数
  • 堆区内存申请和释放
  • 手动计算分配内存大小
  • 返回值为void *
  • 类型不安全,可通过C中强制类型转换 int *p = (int*)malloc(2 * sizeof(double))
  • 不支持重载,不支持构造和析构
  • malloc失败 返回NULL
  • free 需要void *

new底层实现:operator new -> 构造函数 -> 返回对象指针

  1. 调用operator new的标准库函数,分配足够大的内存 保存指定类型的对象
  2. ​执行该类型的构造函数,对成员变量初始化
  3. 返回指向  新分配并构造后的对象的 指针

delete底层实现:指针指向对象析构 -> operator delete 释放内存

  1. 对指针 指向的对象 执行析构函数
  2. 调用 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大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值