在C/C++面试中,两种区别是经常被问到的,第一个是指针和引用的区别;第二个就是我们文章题目所提到的-new/delete和malloc/free的区别。
想要回答出来这类问题,首先要清楚他们的使用,下面我们以new/malloc如何使用为例,来更好的理解这类问题。
看下面两句代码:
int *pa = (int*)malloc(sizeof(int));
int *a = new int();
可以得出new和malloc两个区别:
1.使用malloc申请空间的时候,需要传递参数来标明申请空间的大小;而使用new来申请时,new会根据后面的类型来开辟相应的空间,不需要传递参数。
2.malloc申请空间之后返回的是一个void ,使用其他类型接收的时候需要进行类型转换;而new得到的就是一个相应类型的指针,不需要类型转换。
下面是关于自定义类型的相关代码:
class A
{
public:
A(int a) :_a(a)
{}
private:
int _a;
};
int main()
{
A* a1 = (A*)malloc(sizeof(A));
A* a2 = new A(10);
return 0;
}
通过visual studio调试窗口可以看一下,a1和a2的初始化情况:
3.new会调用构造函数完成空间的初始化,而malloc不会对空间进行初始化;同样delete在销毁空间时会调用析构函数完成资源的清理,而free只会对空间进行销毁。
下面两点很容易就能理解,这里就不使用代码举例了:
4.new/delete是操作符,malloc/free是函数。
5.malloc失败时,会返回nullptr,需要对malloc的返回值进行判空检查;new失败时会抛异常,不需要进行判空检查。
本文由mdnice多平台发布