c++内存管理
我们在开始之前,先看一下这个代码,回答下问题
1.我们正在调试的代码—> 栈区
2.int flobalvar=1;----->全局变量,所有文件都能访问,数据段
3.static int staticGlobalvar=1;----->全局变量,本文件访问,数据段
4.static int staticvar=1;------>局部变量,生存的空间是整个程序运行期间,只能在局部进行访问,存储在静态区中
localvar=1;----->栈
num1----->栈
char2---->局部的数组,栈
*char2---->”abcd"是常量字符串,存储在常量区中(代码段)但是他确实栈区
他是数组,字符串会将自己拷贝一份放进去
pchar3—> 局部变量,栈
*pchar3---->pchar3是指针,存的是地址,解引用之后就是一个字符串,常量区(代码段)
ptr1-----> 局部变量,栈区
*ptr1-----> 动态开辟的空间,堆区
我们写成的代码是在文件中的,也就是存储在磁盘中
c++中动态内存的开辟与释放
new的使用和delete的使用
new的出现就是为了class来服务的,我们在自定义类型变量的时候,如果使用malloc只能开空间,不能初始化,这种看上去没什么,但是对于没有初始化的空间,在使用的时候还是很担心的
但是如果使用new就会自动调用构造函数,并在结束的时候调用析构函数
delete也是一样的,会调用析构函数并且释放空间
使用方法
int main()
{
int* a = new int;//不初始化
int* b = new int(1);//初始化
int* c = new int[4];//不初始化数组
int* d = new int[4]{ 1,2,3,4 };//初始化数组
int(*e)[5] = new int[5][5];//定义二维数组
return 0;
}
int main()
{
//全缺省也会被认为是默认构造
A* a = new A;
A* b = new A(1);
//数组有多少空间就调用多少次
puts("---");
A* c = new A[4]{ 1,2,3 };
puts("---");
A* d = new A[4]{ A(1),A(2),A(3) };
puts("---");
A(*e)[2] = new A[2][2];
delete a;
delete b;
puts("---");
delete[] c;
puts("---");
delete[] d;
puts("---");
delete[5] e;
return 0;
}