malloc
和 new
的区别总结
-
内存分配和初始化:
malloc
只分配内存,不进行初始化。new
分配内存并调用构造函数进行初始化。
-
异常处理:
malloc
失败时返回NULL
。new
失败时抛出std::bad_alloc
异常(除非使用new(std::nothrow)
)。
-
类型安全:
malloc
返回void*
,需要强制转换为目标类型的指针。new
返回正确类型的指针,不需要强制转换。
-
内存释放:
malloc
分配的内存用free
释放。new
分配的内存用delete
或delete[]
释放。
new
运算符在 C++ 中必须同时进行两个操作:
- 内存分配:
new
为对象分配足够的内存。 - 对象初始化:
new
调用对象的构造函数(如果是对象类型)来初始化分配的内存。
malloc
的内存分配过程
-
分配:
malloc
根据请求的大小从堆中分配内存。实际的分配过程涉及到操作系统的堆管理机制,如请求内存页,更新分配表等。 -
管理: 内存分配器通常维护一个自由列表,跟踪可用的内存块。当有请求时,它会从这些空闲块中分配内存,或者请求操作系统提供更多的内存。
-
合并和拆分: 为了提高效率,分配器可能会合并相邻的空闲内存块(合并),或者将大块内存拆分成多个小块(拆分)以供以后使用。
总之,malloc
和 new
都用于内存分配,但 new
提供了更高层次的功能,如对象初始化和异常处理。malloc
主要用于较底层的内存管理,在 C++ 中使用 new
通常更加符合语言的特性。