差异
1.malloc申请内存空间需要指定内存空间的大小,一般通过sizeof来进行。
new申请内存空间是自动进行分配的。
2.malloc申请内存空间失败会返回NULL,new申请内存空间失败会报错
3.malloc申请内存空间是分配在堆上的,new申请内存空间是分配在自由存储区的。(自由存储区指可以自由的分配在自己想在的位置,通过operator new实现)
4.malloc返回值是一种void*类型,new的返回值是对象类型的指针,因此malloc一般配合强制类型转换应用。
5.free传入的是void*的类型,delete传入的数据必须为对象类型的指针,无法为void*的类型,因为需要调用析构函数。
new
1.调用operator new
2.申请内存空间
3.调用构造函数,初始化对象
delete
1.调用析构函数
2.调用operator delete
3.释放内存空间
malloc free
1.申请内存空间申请的是虚拟内存,只有在初始化对象的时候,才建立映射表从而有物理内存的存在。new申请会初始化对象,因此结束后会直接有物理内存。
2.申请空间会多申请16个字节,这个里边保存了申请空间的信息,这也是free无需指定内存空间大小的原因。
3.malloc申请内存空间的时候小于128K的情况下,先进行内存池,之后通过brk系统调用,在堆上申请内存,从而申请内存。大于128K的情况下,调用mmap中断,在文件映射区申请内存。内存池申请内存可以避免频繁的系统调用,中断需要保护现场,因此会比较繁琐。
4.free释放内存之后,如果是内存池的话,会会收到内存池中,内存还存在,如果是mmap系统调用的话会立刻释放我们的内存。