目录
C++执行程序时,将内存分为四个区域:
1.代码区:存放函数体的二进制代码,由操作系统进行管理。
2.全局区:存放全局变量、静态变量和常量。
3.栈区:由编译器自动分配释放,存放函数的参数值、局部变量等。
4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
不同区域存放的数据赋予不同的生命周期,使得编程更灵活。
在程序编译后,生成了exe可执行程序,未执行该程序前分为代码区和全局区。
代码区:
存放CPU执行的机器指令。
代码区时共享的,共享的目的是对于频繁被执行的程序,只需要内存中有一份代码即可。
代码区是只读的,使其只读的原因是防止程序意外的修改了它的指令。
全局区:
全局变量和静态变量存放在此。
全局区还包含了常量区、字符串常量和其它常量。
该区域的数据在程序结束后由操作系统释放。
如下代码说明了全局变量和局部变量存放在内存中的不同区域中:
- #include
- using namespace std;
- #include
-
- //创建普通的全局变量
- int globa_a = 10;
- int globa_b = 10;
-
- int main()
- {
- //创建普通的局部变量
- int a = 10;
- int b = 10;
- cout << "局部变量a的地址为:" << (int)&a << endl;
- cout << "局部变量b的地址为:" << (int)&b << endl;
-
- cout << "全局变量a的地址为:" << (int)&globa_a << endl;
- cout << "全局变量b的地址为:" << (int)&globa_b << endl;
- }
结果:
由编译器自动分配释放,存放函数的参数值、局部变量等。
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
- #include
- using namespace std;
-
-
- int* func()
- {
- int a = 10; //局部变量 存放在栈区,栈区的数据在函数执行完后自动释放
- return &a; //返回局部变量的地址
- }
-
- int main()
- {
- int * p = func(); //接收func函数的返回值,用指针指向a的地址
- cout << *p << endl;
- cout << *p << endl;
- }
结果:
发现两次打印的不一样
第一次能正确打印是因为编译器做了保留,第二次就不再保留了。
由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
在C++中主要用new在堆区开辟内存,手动释放使用delete操作符
- #include
- using namespace std;
- #include
-
- int * func()
- {
- int * p = new int(10); //在堆区开辟一块内存
- return p; //返回这块内存地址
- }
-
- int main()
- {
- //在堆区开辟数据
- int *p1 = func();
- cout << *p1 << endl;
-
- //释放堆区的数据
- delete p1;
-
- }
结果:
- #include
- using namespace std;
- #include
-
- int main()
- {
- int * arr = new int[10]; //在堆区创建包含有10个整型数据的数组
- for (int i = 0; i < 10; i++)
- {
- arr[i] = i;
- }
-
- delete[] arr; //释放堆区数组
- }