回答思路
标准回答 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 没有这样直观的配套设施来扩充内存。