一、前言:
C语言中的内存管理方式当然可以继续沿用至C++,但是仍然存在许多地方比较吃力,所以C++又创立了自己的内存管理方式:即通过new 和 delete操作符来进行动态内存管理。
二、new和delete操作内置类型:
void Test()
{
int* p1 = new int;//动态申请一个int类型的空间
int* p2 = new int(3);//动态申请一个int类型的空间并将其初始化为3
int* p3 = new int[3];//动态申请三个int类型的空间
int* p4 = new int[3]{1,2,3};//动态申请三给int类型的空间并分别将其初始化为1,2,3
delete p1;
delete p2;
delete[] p3;
delete[] p4;
}
注意:申请和释放单个的空间时,应使用new和delete操作符,而申请和释放连续的空间时,应使用new[]和delete[]操作符。
三、new和delete操作自定义类型:
注意:在申请自定义空间的时候,new会自动调用构造函数,delete会自动调用析构函数,而malloc和free则不会调用。
class A
{
public:
A(int a = 0)
:_a(a)
{
cout<<"A():"<<this<<endl;
}
~A()
{
cout<<"~A()"<<this<<endl;
}
private:
int _a;
};
int main()
{
// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间 还会调用构造函数和析构函数
A* p1 = (A*)malloc(sizeof(A));
A* p2 = new A(1);
free(p1);
delete p2;
//内置类型几近一样
int* p3 = (int*)malloc(sizeof(int));
int* p4 = new int;
free(p3);
delete(p4);
A* p5 = (A*)malloc(sizeof(A)*5);
A* p6 = new int[5];
free(p5);
delete[] p6;
return 0;
}
四、operator new/delete函数:
1.new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过 operator delete全局函数来释放空间。
2.operator new/delete的底层又是通过malloc和free来实现的,不过与其不同的是当operator失败时会抛异常而非返回空。
五、new和delete的实现原理:
1.内置类型:
当申请内置类型的时候,new/delete和malloc/free基本相同,但注意new/delete仅仅针对单个空间,想要对连续的多个空间进行操作需要new[]和delete[]才行。
2. 自定义类型:
1.new的原理:
(1).调用operator new函数申请空间
(2).在申请的空间上调用构造函数,实现对象的构造。
2.delete的原理:
(1).调用析构函数,实现对象中资源的清理工作。
(2).调用operator delete函数进行释放相应对象空间的操作。
3.new T [N]的原理:
(1). 调用operator new[]函数,在operator new[]中会调用operator new函数完成N个对象空间的申请。
(2). 在申请的空间上调用N次构造函数。
4.delete[]的原理:
(1). 在释放的对象空间上执行N次析构函数,实现对N个对象中资源的清理.
(2).调用
operator delete[]
释放空间,然后在
operator delete[]
中调用
operator delete
来释
放空间.