new和malloc的你来我往--区别

操作符与函数

new是一个操作符,malloc是一个函数

分配内存的位置

new 在自由存储区,malloc在堆上
自由存储区是c++对new的一个抽象概念,可以是堆,也可以是静态存储区,看operator new在哪给分配内存

内存分配成功的返回值

new返回对象类型指针,malloc返回void* ,根据需要强转类型
new内存分配成功的时候,返回的是对象类型的指针,不需要进行类型转换,new是符合类型安全性的
类型安全可以说是内存安全,类型安全的代码不会去访问没被授权的内存

内存分配失败的返回值

new抛异常出去,malloc返回null
在C语言里(不是c++),int *a = new int() ; if ( null == a )…..这句代码一点意义都没有,new根本不会返回null

分配内存的大小

new根据对象编译器自动分配所需大小,malloc得程序员自己算
new编译器根据类型自己计算,malloc得显示的指出所需内存大小

处理数组

new[ ],方块号内填数组元素的个数,malloc还是得程序员自己算
new[ ]得与delete[ ] 配套使用戳这儿,详情
new的数组,会分别调用构造函数初始化每一个数组元素,释放时每个对象元素调用析构函数

已分配内存的扩充

new出来的空间扩容,不能直观的扩,malloc出来的空间扩容,再对其realloc
malloc的realloc先判断所指的内存后面够不够要扩容的连续空间,如果够,原地扩大可分配的内存地址,返回原来的地址指针,如果不够,先重新分配指定大小的空间,拷贝原来空间的数据过来到新空间,然后释放原来的内存,返回新空间的地址
new没有这么直观的来扩容

是否相互调用

new底层可以调用实现malloc,malloc不可以内部调用new
operator new / operator delete的实现可以基于malloc,反过来不可以

分配内存时内存不足

new:程序员能够制定处理函数或重新制定分配器,malloc:无法通过程序员代码进行处理,返回Null
new 抛异常来反映满足不了这个要求,还会调用一个编写代码者指定的错误处理函数
malloc ,你就啥都干不了了,干看着它返回null

函数重载

new可以被重载,malloc不可以被重载
operator new / operator delete可以被重载
malloc / free 不允许被重载

构造和析构

new底层除了分配空间,还调用了构造函数,delete底层除了释放空间,还调用了析构函数
malloc只是分配了空间,free只是释放了空间

new【调用operator new】【构造函数构造对象,给初值】【返回指向该对象的指针】
delete【调用析构函数】【调用operator delete】

如果有什么不对的地方,可以评论告诉我,望指导!

猜你喜欢

转载自blog.csdn.net/phonycat/article/details/81393174