在C++中,malloc()
和 free()
是来自 C 语言的内存管理函数,而 new
和 delete
是 C++ 中用于动态内存分配和释放的关键字。以下是它们的主要区别:
-
语法与类型安全:
malloc()
和free()
是无类型的,不检查类型安全性。你需要手动计算并指定要分配内存的大小(以字节为单位),并且在使用时需要显式转换指针类型。
int* ptr = (int*) malloc(sizeof(int) * count); free(ptr);
new
和delete
配对使用是类型安全的,编译器会根据类型自动计算所需内存,并确保类型匹配。
int* ptr = new int[count]; delete[] ptr; // 对于数组,使用 delete[] 而非 delete
-
构造与析构:
- 当使用
new
分配对象内存时,它不仅分配了内存空间,还会调用类的构造函数初始化新创建的对象。 - 对于自定义类型,使用
delete
时会调用对象的析构函数来正确清理资源。 malloc()
和free()
不执行任何构造或析构操作,所以不适合用来直接创建和销毁具有非平凡构造/析构行为的对象。
- 当使用
-
内存模型:
malloc()
和free()
在C++中依然可以工作,并且底层机制可能与new
和delete
相似,但new
可能在某些实现上有所不同,比如它可能在自由存储区之外的其他位置(如静态存储区)分配内存。
-
异常处理:
new
在无法分配内存时会抛出std::bad_alloc
异常,而malloc()
则通常返回NULL
(或nullptr
)表示失败,需开发者自行检查。- 同理,当使用
delete
处理异常时,析构过程可能会被恰当处理,而free()
操作不会涉及任何异常处理。
-
重载版本:
- C++ 允许重载
operator new
和operator delete
来定制内存分配策略,而malloc()
和free()
不可重载。
- C++ 允许重载
-
使用习惯:
- 在现代C++编程实践中,推荐尽量使用
new
和delete
而不是malloc()
和free()
,除非有特殊需求或兼容性考虑,因为前者更符合面向对象的特性,并提供更好的类型安全和资源管理机制。
- 在现代C++编程实践中,推荐尽量使用