自学内容网 自学内容网

C++内存管理

一. C++内存分布

在这里插入图片描述

在这里插入图片描述


globalVar在哪里?----->全局变量在静态区(数据段)
staticGlobalVar在哪里?----->静态变量在静态区(数据段)
staticVar在哪里?----->静态的局部变量也是静态变量,在静态区(数据段)
localVar在哪里?----->局部变量在栈

num1是数组名,表示首元素地址
num1数组中存储的元素也是在栈上的,所以首元素地址也是栈上的地址

num1 在哪里?----->。栈
char2在哪里?-----> 栈
*char2在哪里?----->(char2在sizeof时代表数组名,运算时代表首元素地址)

pChar3在哪里?----->pChar3是一个指针,是字符串常量"abcd"的地址,指针变量本身是在栈上创建的
*pChar3在哪里?----->*pChar3是字符串常量,在常量区(代码段)

指针变量本身是在栈上创建的,指针管理的空间都是在堆上创建的
1.简单理解:指针变量是这个栈帧里的局部变量,存储在栈里
2.ptr123管理的空间都是动态开辟的内存(malloc,realloc),这些空间是在堆上创建的

ptr1在哪里?----->栈
*ptr1在哪里?----->ptr1存的是地址,地址是指向malloc的,malloc在堆上

二. C++内存管理方式(new和delete)

2.1 C语言动态内存管理方式

malloc/calloc/realloc/free

但是开辟动态内存,在函数结束时,需要自己释放free()

2.2 C++内存管理

内置类型的内存管理

C++有自己的内存管理方式:通过newdelete操作符进行动态内存管理。(它们也是在堆上动态申请)

newdelete 是新的关键字和操作符。使用:new后面直接+类型即可,如果想初始化,就在类型后面+括号,括号内写初始化值。

//管理对象

int main()
{
int* ptr1=new int(9);
int* ptr2 = new int;
//不使用以后记得释放
    delete ptr1;
    delete ptr2;
return 0;
}

//管理对象数组:如果想new多个int,则new int[ ] ,在释放时,也是delete[ ]

int main()
{
int* ptr1 = new int[9];
delete[] ptr1;

return 0;
}
int main()
{
//动态申请10个int类型的空间
int* ptr1 = new int[9];//未初始化
int* ptr2 = new int[3]{45,53,23};//对数组进行初始化(也可以只初始化两个,那第三个就是0,切不可多初始化(比如4个),会报错)
delete[] ptr1;

return 0;
}

在这里插入图片描述

自定义类型的内存管理

对于自定义类型,malloc和new是有区别的。

malloc只开辟空间,而new会开空间+调用构造函数。
free只会释放空间,delete会调用析构+释放空间

在这里插入图片描述
new多个自定义类型的空间----->相当于new了多个这个对象,然后放到数组里去。

这样的话,就会调用多次构造和析构。

A* pa1 = new A[10];
delete[] pa1;


//如果想要初始化
A* pa2 = new A[9]{A(2),A(9)};//使用匿名对象
A* pa3 = new A[9]{2,9};//使用隐式类型转换
delete[] pa2;
delete[] pa3;

在这里插入图片描述

三. operator new和operator delete函数

之前学习的newdelete是“用户”进行动态内存申请和释放的操作符operator newoperator delete是系统提供的全局函数

operator new 实际也是通过malloc来申请空间
【如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常】

operator delete 最终是通过free来释放空间的

new=申请空间(operator new)+构造
delete=析构(operator delete)+释放空间

new在底层调用operator new全局函数来申请空间
delete在底层通过operator delete全局函数来释放空间

四. new和delete的实现原理

4.1 内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似.

不同的地方是:
new/delete申请和释放的是单个元素的空间new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

4.2 自定义类型

在这里插入图片描述
在这里插入图片描述


原文地址:https://blog.csdn.net/2402_83250773/article/details/143506652

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!