首页 > 试题广场 >

请你来回答一下new和malloc的区别

[问答题]

请你来回答一下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 开辟内存失败返回 NULLnew 开辟内存失败抛出 bad_alloc 类型的异常,需要捕 获异常才能判断内存开辟成功或失败,new 运算符其实是 operator new 函数的调用,它底 层调用的也是 malloc 来开辟内存的,new 它比 malloc 多的就是初始化功能,对于类类型来 说,所谓初始化,就是调用相应的构造函数。

4)malloc 开辟的内存永远是通过 free 来释放的;而 new 单个元素内存,用的是 delete,如 果 new[]数组,用的是 delete[]来释放内存的。

5)malloc 开辟内存只有一种方式,而 new 有四种,分别是普通的 new(内存开辟失败抛出 bad_alloc 异常), nothrow 版本的 newconst new 以及定位 new

发表于 2020-09-04 10:53:30 回复(0)
因为void *型的指针在赋值的时候可以自动进行类型转换,所以对malloc的返回值做强制类型转换是没必要的。强制类型转换是经典C里面的做法。 ——《C语言程序设计现代方法第2版》
发表于 2021-03-22 21:24:20 回复(0)
1.new分配内存是按照对象的大小分配,malloc是按照指定大小来分配内存。 2.new对象会调用构造函数,而malloc不会。 3.delete会释放对象会调用析构函数,而malloc不会。 4.new返回的是对象指针,malloc返回的是void*,要自己转换。 5.5、new是一个操作符可以重载,malloc是一个库函数。 6、malloc分配的内存不够的时候,可以用realloc扩容。扩容的原理?new没用这样操作。 7、new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。 8、申请数组时: new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n。
编辑于 2020-09-04 10:16:48 回复(0)