面试题答案
一键面试- 类型处理方式不同
- malloc:
malloc
是C标准库函数,它只管分配指定字节数的内存空间,不关心所分配内存的具体类型。它返回的是void*
类型指针,使用时需要强制类型转换为所需的类型指针。
- new:
new
是C++的关键字,它在分配内存时会根据要创建的对象类型进行内存分配和初始化。它会调用对象的构造函数来完成对象的初始化工作,并且返回的指针类型就是所创建对象的类型指针,无需额外的强制类型转换。
- malloc:
- 举例说明
- 使用malloc:
#include <stdio.h>
#include <stdlib.h>
class MyClass {
public:
MyClass() {
printf("MyClass constructor called\n");
}
~MyClass() {
printf("MyClass destructor called\n");
}
};
int main() {
// 使用malloc分配MyClass对象的内存
MyClass* obj1 = (MyClass*)malloc(sizeof(MyClass));
if (obj1 == nullptr) {
printf("Memory allocation failed\n");
return 1;
}
// 此时obj1指向的内存未初始化,需要手动调用构造函数
new (obj1) MyClass();
// 使用obj1
// 用完后手动调用析构函数并释放内存
obj1->~MyClass();
free(obj1);
return 0;
}
- 使用new:
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor called" << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called" << std::endl;
}
};
int main() {
// 使用new分配并初始化MyClass对象
MyClass* obj2 = new MyClass();
if (obj2 == nullptr) {
std::cout << "Memory allocation failed" << std::endl;
return 1;
}
// 使用obj2
// 用完后释放内存,会自动调用析构函数
delete obj2;
return 0;
}
在上述例子中,malloc
分配内存后需要手动调用构造函数初始化对象,释放内存前也要手动调用析构函数;而new
在分配内存的同时就调用构造函数初始化对象,delete
在释放内存时自动调用析构函数。