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 通常更加符合语言的特性。
