malloc、free和new、delete区别。
malloc和free是C语言里的库函数,new和delete是c++里的操作符,项目中有c和c++混编的时候要注意他们之间的差异,共同的特征就是用来分配内存和释放内存。
a.new自动计算所需内存空间大小,而malloc是手动计算的(后面还要接一个sizeof,sizeof是编译器帮我们计算的)
b.new返回的是对象类型的指针,malloc返回的是void*,之后还要进行类型转换
c.new如果分配失败,而malloc返回的是NULL
malloc分配的是物理内存呢还是虚拟内存,答案:虚拟内存
使用malloc时,如果小于128是通过break系统调用,大于是通过memo map去分配内存空间的,如果分配的空间比较小,是在内存值中进行分配的,如果内存值里没有数据,我们要通过系统调用break,从堆上分配空间
d.new是在free store(自由存储区)进行分配的,malloc通常是在堆上(或者文件映射区)分配的,我们来理解一下free store,
调用new操作符时,实际上1、先调用的operator new 2、申请足够的空间 3、使用构造函数,初始化成员变量,而malloc通常是没有初始化的,这就引出另一个面试问题:malloc调用后是否立刻得到物理内存?
malloc分配的是虚拟内存,虚拟内存和物理内存之间有一个页表
d.delete需要对象类型的指针,free只需要void* 类型的指针即可
delete:1、先调用析构函数2、调用operator delete3、释放空间
那为什么free不需要具体的指针类型呢?
free(p)怎么知道该释放多大的空间?malloc分配出一个具体的空间地址的时候,实际上多给我们分配了16个字节:16+mem,malloc返回的是mem的首地址,使用free时会统一地左偏移16个字节,这16个字节存储了我们的分配的内存块的描述信息,这个描述信息又包含了后面memory的长度,所以free传一个void*的指针时,立刻知道应该释放多大的空间(因为会左移16个字节,这16个字节中会包含我们之前申请分配内存空间的大小)
free释放内存后,内存还在吗?如果是通过brk系统调用分配的空间,或者从内存值中分配的空间,那么释放的内存只是回到内存值中了,如果是通过mmap系统调用分配的内存空间,那么操作系统会立刻释放内存
一个是库函数,一个是操作符,操作符就意味着编译器帮我们做了很多事情,