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++有自己的内存管理方式:通过new
和delete
操作符进行动态内存管理。(它们也是在堆上动态申请)
new
和delete
是新的关键字和操作符。使用: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函数
之前学习的new
和delete
是“用户”进行动态内存申请和释放的操作符,operator new
和operator 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)!