在C语言中我们用malloc,calloc,realloc,free来管理堆上的内存,那么c++是怎样的呢?
c++用new和delete两个关键字去取代了上诉函数。
这是一个简单的例子。
void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
//申请多个是注意使用delete[]
delete[] ptr6;
}
从中我们可以看到比C语言更加简洁,因为省掉了强制类型转换和需要传参传字节数的麻烦。
new对于内置类型只开空间相当于malloc,里面存的是随机值,但对于自定义类型就不一样了,他们去掉用构造函数去进行初始化操作。
delete也是一样的,对于内置类型相当于free,但是对于内置类型他会先调用析构函数,然后才释放空间。
class A
{
public:
A(int a1 = 0, int a2 = 0)
:_a1(a1)
,_a2(a2)
{
cout << "A(int a1 = 0, int a2 = 0)" << endl;
}
A(const A& aa)
:_a1(aa._a1)
{
cout << "A(const A& aa)" << endl;
}
~A()
{
//delete _ptr;
cout << "~A()" << endl;
}
void Print()
{
cout << "A::Print->" << _a1 << endl;
}
private:
int _a1 = 1;
int _a2 = 1;
};
int main()
{
//调用默认构造
A* p1 = new A;
//调用构造
A* p2 = new A(2,2);
//用匿名对象去调用拷贝构造进行初始化
A* p4 = new A[3]{ A(1,1), A(2,2), A(3,3)};
//先析构在释放空间
delete p1;
delete p2;
delete[] p3;
return 0;
}