new 和 malloc 有什么区别?
new
和 malloc
都是用来在堆上分配内存的方法,但它们在使用和功能上有一些重要的区别:
- 类型安全:
new
是 C++ 中的操作符,它不仅分配内存,还会调用对象的构造函数,保证类型安全。这意味着,使用new
时,你不需要指定分配多少字节的内存,只需指定对象类型。malloc
是 C 语言中的函数,仅分配内存,不调用构造函数。使用malloc
时,需要指定需要分配的字节大小,且返回的是void*
类型,通常需要类型转换。
- 返回类型:
new
返回的是指定类型的指针。malloc
返回的是void*
,需要转换为相应类型的指针。
- 失败时的行为:
new
在内存分配失败时,会抛出一个异常。malloc
在分配失败时,返回NULL
。
- 与删除操作配对:
new
配对使用delete
来释放内存,并调用析构函数。malloc
配对使用free
来释放内存,不调用析构函数。
- 重载:
new
和delete
可以被重载,以提供特殊的内存分配和释放行为。malloc
和free
不能被重载。
应用场景举例
假设有一个 Student
类,需要创建一个 Student
对象:
- 使用
new
:Student* student = new Student(); // 这里会调用 Student 的构造函数 delete student; // 这里会调用 Student 的析构函数
- 使用
malloc
:Student* student = (Student*)malloc(sizeof(Student)); // 需要手动调用构造函数,通常通过 placement new // 构造函数不会自动调用 free(student); // 需要手动调用析构函数,析构函数不会自动调用
在 C++ 编程中,推荐使用 new
和 delete
,因为它们提供更好的类型安全性和对象生命周期管理。在一些特殊情况下,例如与 C 代码交互或者自定义内存分配器时,可能会用到 malloc
和 free
。