请你来回答一下new和malloc的区别
1)malloc 和 new 都是在堆上开辟内存的,malloc 只负责开辟内存,没有初始化功能,需要 用户自己初始化;new 不但开辟内存,还可以进行初始化,如 new int(10);表示在堆上开辟 了一个 4 字节的 int 整形内存,初始值是 10,再如 new int[10]();表示在堆上开辟了一个包 含 10 个整形元素的数组,初始值都为 0。
2)malloc 是函数,开辟内存需要传入字节数,如 malloc(100);表示在堆上开辟了 100 个字 节的内存,返回 void*,表示分配的堆内存的起始地址,因此 malloc 的返回值需要强转成指 定类型的地址;new 是运算符,开辟内存需要指定类型,返回指定类型的地址,因此不需要 进行强转。 如堆上开辟 int 整形: int *p1 = (int*)malloc(sizeof(int)); => 根据传入字节数开辟内存,没有初始化 int *p2 = new int(0); => 根据指定类型 int 开辟一个整形内存,初始化为 0 int *p3 = (int*)malloc(sizeof(int)*100); => 开辟 400 个字节的内存,相当于包含 100 个整形元素的数组,没有初始化 int *p4 = new int[100](); => 开辟 400 个字节的内存,100 个元素的整形数组,元素 都初始化为 0
3)malloc 开辟内存失败返回 NULL,new 开辟内存失败抛出 bad_alloc 类型的异常,需要捕 获异常才能判断内存开辟成功或失败,new 运算符其实是 operator new 函数的调用,它底 层调用的也是 malloc 来开辟内存的,new 它比 malloc 多的就是初始化功能,对于类类型来 说,所谓初始化,就是调用相应的构造函数。
4)malloc 开辟的内存永远是通过 free 来释放的;而 new 单个元素内存,用的是 delete,如 果 new[]数组,用的是 delete[]来释放内存的。
5)malloc 开辟内存只有一种方式,而 new 有四种,分别是普通的 new(内存开辟失败抛出 bad_alloc 异常), nothrow 版本的 new,const new 以及定位 new。