malloc和new区别

1. 申请的内存所在位置

  malloc是函数,而new是C++关键字。malloc从堆上申请内存,而new从自由存储区中申请内存,自由存储区是C++中基于new操作符的一个抽象概念,凡是用new申请内存,该内存即为自由存储区,可以是堆也可以是静态存储区。而堆是操作系统中的术语,是一块特殊的内存。

2.返回类型安全性

   malloc返回的是void*,需要自己强转成需要的类型,所以类型不安全,new返回对象的指针,类型与对象完全匹配,所以new是符合类型安全的操作符。

3.内存分配失败时的返回值

malloc分配失败返回NULL,习惯在返回之后判断指针是否为空来判断内存是否分配成功。而new内存分配失败抛出bad_alloc异常,可以通过try,catch来捕获异常并处理它。

4.是否需要指定内存大小

  new无需指定内存块的大小,编译器会根据类型信息自动计算。而malloc需要显示指出所需内存的尺寸。

5.是否调用构造函数/析构函数

  用new为对象分配内存经历三个过程:

            1.调用operator new 分配一块足够大的内存来存储对象。

             2.调用对象的构造函数构造对象

              3.返回对象的指针

   delete释放对象经历2个步骤:

        1.调用对象的析构函数

        2.调用opreator delete 释放对象所占内存


而malloc不会调用构造,free不会调用析构

6.对数组的处理

   C++通过new 类型[] 来处理数组类型。

   int *p = new int[10];

  通过 delete [] p 配套的来释放数组占用内存,否则会造成内存泄漏。

  而malloc 需要自己指定数组大小

7.new与malloc是否可以相互调用

 operator new实现是调用malloc,operator delete实现是调用free。

 而malloc不可以调用new

8.是否可以被重载

operator new和 operator delete 可以被重载,总共提供了8个重载版本,4个可能抛出异常的,4个承诺不抛出异常。

 void* operator new (size_t)

void* operator new[](size_t)

void * operator delete(void *) noexcept

void * operator delete[](void *0) noexcept


void *operator new(size_t,nothrow_t&);

9. 能够直观地重新分配内存

用malloc分配内存后,如果使用时发现内存不够,可以调用realloc来重新分配内存实现内存扩充,realloc先判断当前指针所指内存是否有足够的连续空间,有就原地扩大内存,并返回原来的指针,没有的话,分配一块新的扩大后的内存,将原来的数据拷贝到新的内存中,释放原来的内存,返回新地址的指针。

new没有配套设施。

10. 客户处理内存分配不足

 new在抛出异常前,先调用用户指定的错误处理函数new_handler,它是一个指针类型,为了指定错误处理函数,用户要调用库函数set_new_handler,它的参数为new_handler指针,指向了内存分配失败时应该调用的函数,返回值也是一个newhander指针,指向了set_new_handler前正在执行的new_handler函数。

malloc不能指定内存分配时该做什么,只能看着返回NULL

猜你喜欢

转载自blog.csdn.net/qq_37924084/article/details/80205918