首页 > 试题广场 >

请你说说 new 的实现原理,new 和 malloc 的区

[问答题]
请你说说 new 的实现原理,new 和 malloc 的区别
new的实现原理 简单类型时底层会调用malloc函数。区别: new是操作符malloc是函数,malloc()和free()申请释放内存是在堆上完成的,new和delete是在静态储存区完成的,malloc()申请内存失败范围NULL 成功返回VOID类型的指针,而new成功返回对应类型的内存,失败会抛出异常。并且malloc()可以指定内存大小,并且可以扩充内存而new办不到。
发表于 2022-08-29 21:27:03 回复(0)
我学校教科书教的是new/delete是在堆区分配内存,malloc/free是在自由存储区分配内存。谁错了?
编辑于 2022-04-28 11:49:03 回复(2)
new 的实现原理: 如果是简单类型,则直接调用 operator new(),在 operator new() 函数中会调用 malloc() 函数,如果调用 malloc() 失败会调用 _callnewh(),如果 _callnewh() 返回 0 则抛出 bac_alloc 异常,返回非零则继续分配内存。 如果是复杂类型,先调用 operator new()函数,然后在分配的内存上调用构造函数。 new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,new内存分配失败时,会抛出bac_alloc异常。malloc内存分配成功则是返回void * (可强制转换为任何类型),需要通过强制类型转换将void*指针转换成我们需要的类型,malloc分配内存失败时返回NULL。 new 操作符从自由存储区上分配内存空间,而 malloc 从堆上动态分配内存。
发表于 2022-11-01 21:55:16 回复(0)
new会调用构造函数 在开辟空间的时候初始化
发表于 2022-05-18 11:29:10 回复(0)
new是操作符,new不需要参数确认申请空间大小,new会调用构造函数,new从堆中申请内存,new报错时会抛出异常,new可以重载
发表于 2023-02-09 19:18:39 回复(0)
new 底层调用操作系统的 接口,new失败会抛出异常,new是关键字,malloc是函数,
编辑于 2023-03-29 14:17:12 回复(0)
1. new 的实现原理: 如果是简单类型,则直接调用 operator new(),在 operator new() 函数中会调用 malloc() 函数,如果调用 malloc() 失败会调用 _callnewh(),如果 _callnewh() 返回 0 则抛出 bac_alloc 异常,返回非零则继续分配内存。 如果是复杂类型,先调用 operator new()函数,然后在分配的内存上调用构造函数。 2. new 和 malloc 的区别 : - new 是操作符,而 malloc 是函数; - 使用 new 操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而 malloc 则需要显式地指出所需内存的尺寸; - new 分配失败的时候会直接抛出异常,malloc 分配失败会返回 NULL; - 对于非简单类型,new 在分配内存后,会调用构造函数,而 malloc 不会; - new 分配成功后会返回对应类型的指针,而 malloc 分配成功后会返回 void * 类型; - malloc 可以分配任意字节,new 只能分配实例所占内存的整数倍数大小; - new 可以被重载,而 malloc 不能被重载; - new 操作符从自由存储区上分配内存空间,而 malloc 从堆上动态分配内存; - 使用 malloc 分配的内存后,如果在使用过程中发现内存不足,可以使用 realloc 函数进行内存重新分配实现内存的扩充,new 没有这样直观的配套设施来扩充内存。
发表于 2024-05-17 10:55:10 回复(0)
new的实现原理: 1、如果是简单类型,new会在底层调用malloc函数 2、malloc失败则调用_callnewh函数 3、如果是复杂类型,先调用operator new()函数,再在分配的内存上调用构造函数 new和malloc的区别: 1、new是操作符,而malloc是函数 2、使用new操作符申请内存时无需指定内存的大小,编译器会根据类型自动计算,而malloc需要显式地指出所需内存的大小 3、malloc可以分配任意字节大小,new只能分配指定实例所占内存的整数倍大小 4、new可以被重载,而malloc不可以
编辑于 2024-04-08 15:58:21 回复(0)
1. new是操作符,可以被重载;malloc是函数;new的底层实现是malloc 2. 如果是基本类型,直接调用operator new 重载函数,函数内部是malloc分配内存。 3. 如果是复杂的自定义类型,也是会调用operator new()重载函数,函数内部是malloc分配内存,不过,分配内存之后,还会再这上面调用构造函数。
发表于 2023-11-09 22:06:25 回复(0)
1. new主要完成2件事,第一就是调用operator new()函数申请内存,operator new()中其实调用了malloc()来申请内存;第二件事就是在分配的内存上调用构造函数构造对象,最后返回对应类型的指针。 2. new是C++的操作符,而malloc是C中的库函数; new在申请内存时无需传入大小,而malloc需要手动计算好大小传入;new分配内存失败时会抛出bad_cast的异常,而malloc是返回一个空指针NULL;new除了申请内存外,还会调用构造函数;new返回的是一个具体类型的指针,而malloc返回的是一个void *,因此new不需要类型转换,new更加地类型安全。
发表于 2023-10-24 11:37:21 回复(0)
补充一条,new和delete调用了构造方法和析构方法,malloc和free没有
发表于 2023-09-22 20:43:40 回复(0)
new底层首先会调用一个operator new() 的函数,自动计算内存大小,开辟一块内存空间;其次,会将operator new() 的返回值进行指针的强制类型转换;最后会调用类的构造函数。 new 和 malloc 的区别? 1. new是一个操作符,malloc是C/C++的一个标准库函数。 2. new自动计算分配内存的大小,malloc需要手动分配内存大小 3. new是类型安全的,malloc不是 4. new会调用相关对象的构造函数,malloc不会 5. new底层是通过malloc实现的,直接free不会报错,但是不会执行析构函数。
发表于 2023-08-12 11:20:10 回复(0)
new 和 malloc 的区别 - new 是操作符,而 malloc 是函数; - 使用 new 操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而 malloc 则需要显式地指出所需内存的尺寸; - new 分配失败的时候会直接抛出异常,malloc 分配失败会返回 NULL; - 对于非简单类型,new 在分配内存后,会调用构造函数,而 malloc 不会; - new 分配成功后会返回对应类型的指针,而 malloc 分配成功后会返回 void * 类型; - malloc 可以分配任意字节,new 只能分配实例所占内存的整数倍数大小; - new 可以被重载,而 malloc 不能被重载; - new 操作符从自由存储区上分配内存空间,而 malloc 从堆上动态分配内存; - 使用 malloc 分配的内存后,如果在使用过程中发现内存不足,可以使用 realloc 函数进行内存重新分配实现内存的扩充,new 没有这样直观的配套设施来扩充内存。
发表于 2023-07-26 16:59:40 回复(0)
new是关键字,malloc是函数,new和delete是在静态存储区完成的,malloc和free是在堆上分配和释放内存
发表于 2023-04-06 21:39:08 回复(0)
new 简单类型调用malloc, 然后构造函数;new是操作符, malloc是函数;都是堆上;new 可以重载
发表于 2023-02-23 09:58:36 回复(0)
操作符是利用函数实现的比函数更简洁,C++可以对操作符进行重载,操作符在编译阶段处理而函数在代码段中以call的形式调用。new是操作符,malloc是函数。
发表于 2022-07-13 17:42:33 回复(0)