内存分区,复习
内存四区:
代码区,全局区,栈区,堆区。
1.1 代码区和全局区
全局区存放的数据
1.2 栈区
#include<iostream>
using namespace std;
//栈区数据注意事项 -- 不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放
int * func(int b) //形参数据也会放在栈区
{
int a = 10; //局部变量 存放在栈区,栈区的数据在函数执行完后自动释放
return &a;//返回局部变量的地址
}
int main()
{
int* p = func(1);
cout << *p << endl;//第一次输出10
cout << *p << endl;//第二次输出乱码
system("pause");
return 0;
}
局部变量放在栈上,栈上数据的特点是,当该函数执行完,栈上的数据就清空了。第一次能正常输出10是因为,编译器对该内存上的地址做了一次保留。
1.3 在堆区创建数据
#include<iostream>
using namespace std;
int * func()
{
int a = 10;
return &a;//局部变量的地址用指针返回,在变量释放之后,再操作这个内存就是非法操作了,这是栈上的特点。
//指针 本质是局部变量,放在栈上,指针保存的的数据放在堆区。
int * p = new int(10);
return p;
}
int main()
{
//在堆区开辟数据
//堆区的数据由程序员手动释放。
int* p = func();
cout << *p << endl;
system("pause");
return 0;
}
堆区上的数据的释放
#include<iostream>
using namespace std;
int * func()
{
//在堆区创建整形数据
//new返回的是 该数据类型的指针
int* p = new int(10);
return p;
}
void test01()
{
//创建10个整形数据的数组,在堆区
int* arr = new int[10];
for (int i = 0; i < 10;i++)
{
arr[i] = i * 10;
}
for (int i = 0; i < 10;i++)
{
cout << arr[i] << endl;
}
//释放堆区数组时,要加[]才可以
delete[] arr;
}
int main()
{
int* p = func();
cout << *p << endl;
cout << *p << endl;
//堆区的数据由程序员管理开辟和,手动释放
//释放堆区数据用关键字delete
delete p;
test01();
system("pause");
return 0;
}