new/delect和malloc/free的区别

1. new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。

2. 内存分配位置不同

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配。

3. 是否调用构造函数和析构函数

使用new操作符来分配对象内存时会经历三个步骤:

  • 第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。
  • 第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。
  • 第三部:对象构造完成后,返回一个指向该对象的指针。

使用delete操作符来释放对象内存时会经历两个步骤:

  • 第一步:调用对象的析构函数。
  • 第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。

而malloc不会调用对象的构造函数和析构函数,所以malloc不适合为自定义类型分配内存。

4. 返回类型

new需要明确指定需要内存的类型,它会根据指定类型自动计算需要分配的内存的大小,不需要手动指定,分配成功后返回的是指向该类型的指针是类型安全的,分配失败时,会抛出bac_alloc异常。

malloc需要手动指定分配内存的大小,内存分配成功时返回的void *,需要显示转换类型,分配失败时返回NULL。

 

参考博客

https://www.cnblogs.com/ywliao/articles/8116622.html

https://blog.csdn.net/qq_33573235/article/details/79485266

https://www.cnblogs.com/Tang-tangt/p/9754708.html

 

posted @ 2019-07-09 19:59  xd_xumaomao  阅读(214)  评论(0编辑  收藏  举报