C++内存管理

396 words

C++ 内存管理方式

C语言中的内存管理方式在C++中仍然可以继续使用,但是也有很多地方并不好用,例如栈的生成与销毁,用起来比较复杂,因此C++提出了自己的内存管理方式,通过new和delete来进行动态内存管理

new delete 操作内置类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void fun()
{
int* p1 = new int;
// 这里直接申请一个int的空间

int* p2 = new int(10);
// 这里申请一个int的空间并且初始化为 10

int* p3 = new int[10];
// 这里申请10个int的空间

delete p1;
delete p2;
delete[] p3;
}

包括 malloc 和 free 这些申请与销毁空间的操作必须匹配起来使用,切忌混用

new delete 操作自定义类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
public:
A(int a = 0)
:_a(a)
{
cout<<"A(int a = 0)"<<endl;
}
~A()
{
cout<<"~A()"<<endl;
}
private:
int _a;
};
int main()
{
A* p1 = (A*)malloc(sizeof(A));
A* p2 = new A(1);
free(p1);
delete p2;
return 0;
}

与 malloc 和 free 不同的是 new 会调用构造函数而 delete 会调用析构函数

new delete 的实质

operator new 与 operator delete 函数

new 和 delete 是动态内存申请与释放的操作符,而上面那两个函数是系统的全局函数,实际上如果我们找到new与delete的定义,观察发现,仍然使用malloc与free来进行操作的

我们可以通过反汇编来观察

在这里插入图片描述
这里我们可以看到,先调用了operator new 再调用了构造函数

而delete是先调用析构函数再调用operator delete

Comments