new/delete
和 malloc/free
是 C++ 和 C 语言中用于动态内存分配的两组不同的函数,它们之间存在一些关键的区别:
-
语言层面:
malloc
和free
是 C 语言标准库中的函数,也可以在 C++ 中使用。new
和delete
是 C++ 语言中引入的操作符,专门用于对象的内存分配和释放。
-
构造和析构:
malloc
只负责分配内存,不调用对象的构造函数。free
也只是释放内存,不调用析构函数。new
在分配内存的同时会调用对象的构造函数,初始化对象。delete
在释放内存前会调用对象的析构函数,进行清理工作。
-
类型安全:
malloc
返回一个void*
类型的指针,需要手动转换为正确的类型,这可能会导致类型安全问题。new
直接返回正确类型的指针,提高了类型安全性。
-
错误处理:
malloc
在无法分配内存时返回NULL
。new
在默认情况下会抛出一个std::bad_alloc
异常,除非使用了nothrow
版本,例如new (nothrow) T
。
-
内存对齐:
new
通常确保内存对齐满足对象类型的要求。malloc
分配的内存对齐通常是较为基本的,可能需要手动处理对于复杂类型的对齐要求。
-
重载:
new
和delete
可以被重载,允许自定义它们的行为。malloc
和free
不能被重载。
因此,在 C++ 中,推荐使用 new
和 delete
来分配和释放对象的内存,以利用它们提供的构造、析构和类型安全等特性。如果只是简单地分配一段内存而不涉及对象构造,malloc
和 free
仍然可以使用,但这种情况比较少见。