我将从几方面阐述一下new和malloc:
1.malloc和free是C语言中的库函数,而new和delete是C++中的位运算符,在其底层调用了malloc和free函数,导致在某些情境下,new和delete的效率要低一点。
2.计算大小。
malloc函数在调用的时候需要给定所需要申请的空间的大小
new则是自动计算大小。
3.返回值的区别。
malloc函数成功返回void*,失败返回null。
new成功返回相应对象指针,失败抛出异常。
4.空间地址。
new申请的是free store(自由空间),可以自己指定。
malloc申请空间大小可以分两种:
i.堆空间。当申请空间小于128k时,调用brk系统调用。
当free时,空间回归堆空间而不是释放。
ii.mmap映射区。当申请空间大于128k时,调用mmap系统映射。
当free时,空间被释放。
5.是否初始化。
看一下new的工作原理:
i.operator new
ii.申请空间
iii.调用构造函数,初始化成员变量。
所以new创建的是初始化了的。而且因为是初始化了的,导致new创建的对象是有真实的物理空间的。
malloc是没有初始化的。
6.引出的问题1:malloc函数申请的是物理空间还是逻辑空间?
因为malloc并没有堆变量初始化,所以是逻辑空间。
7.delete和free
I.delete需要的是要释放的对象指针。
为什么不是对象指针就不行呢?看一下delete的工作原理:
i.调用析构函数
ii.operator delete
iii.释放空间
如果不是对象指针,那么析构函数就会出错,导致程序异常终止。
II.free需要void*的指针。
为什么释放空间的时候不需要释放空间的大小。
这是因为malloc在申请空间的时候多申请了16个字节大小的空间,用于存储申请空间的大小。
8.引出的问题2:malloc调用后会不会立刻得到物理内存?
不会,等到初始化后,中断请求,才会写到物理内存中去。