我们在使用C语言时,通常使用malloc函数来开辟空间,在C++中,我们通常不这么做(当然,这么做仍旧是可以的)。
在C++中,我们通常使用new来开辟动态空间。
int* a = new int;
比如我们想要开辟一个四字节整形数据的堆空间,就可以这样,new后边跟你的数据类型。
这样写相较于malloc而言,要更加方便快速。
同样的,当我们需要释放这篇空间时,需要用到delete。
delete a;
new delete是操作符,malloc和free是函数,这是他们的不同。
但实际上,new delete的底层还是依赖于malloc和free来实现功能的。
我们通过debug进入到反汇编中进行观察,发现new和delete实际上也是调用了相关的函数来完成动态开辟的。
而这函数其内部也是调用了malloc和free函数。
当你的new开辟空间失败的时候,不会返回空指针,而是直接报错。
那我们要new一个数组呢?
int* a = new int[10];
//还可以对其进行初始化
int *b=new int[3]{1,2,3};
最后释放其空间
delete[]a;//切记,一定要注意这个[]
这是数组空间的开辟和释放的方法。
我们知道我们在C++中可以自定义类
而new和delete与malloc和free最大的不同是,new会同时调用构造函数,delete会同时调用析构函数。
我们简单的定义这样一个类
class A
{
public:
A()
:_a(0)
{
cout << "构造" << endl;
}
~A()
{
cout << "析构" << endl;
}
private:
int _a;
};
new一个数组
int main()
{
A* pa = new A[10];
delete[]pa;
return 0;
}
运行之后,我们可以发现,调用了十次构造函数以及十次析构函数。
我们对类做出调整,再次实验。
class A
{
public:
A()
:_a(0)
{
cout << "构造--" <<this<<endl;
}
~A()
{
cout << "析构--" <<this<< endl;
}
private:
int _a;
};
int main()
{
A* pa = new A[10];
cout << endl;
delete[]pa;
return 0;
}
我们可以看到,最先构造的最后析构,最后构造的,最先析构。