一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
1.1 前言
程序在执行时,内存划分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理的
- 全局区:存放全局变量和静态变量以及全局常量
- 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量,局部常量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
1.2代码区
作用: 存放 CPU 执行的机器指令
特点:
-
- 代码区是
共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
- 代码区是
-
- 代码区是
只读的,使其只读的原因是防止程序意外地修改了它的指令
- 代码区是
1.3 全局区
作用: 存放全局变量和全局常量、静态变量. 特点: 该区域的数据在程序结束后由操作系统释放.
#include<iostream>
#include<string>
using namespace std;
//全局变量
string q_a = "Mona";
//全局常量
const string q_c_a = "Mona";
int main() {
int a = 10;//局部变量
const int j_a = 10;//局部常量
static int s_a = 10;
cout << "全局变量地址为: " << (int)&q_a << endl;
cout << "全局常量地址为: " << (int)&q_c_a << endl;
cout << "局部变量地址为: " << (int)&a << endl;
cout << "局部常量地址为: " << (int)&j_a << endl;
cout << "静态变量地址为: " << (int)&s_a << endl;
system("pause");
return 0;
}
输出:
全局变量地址为: 4792356
全局常量地址为: 4792364
局部变量地址为: 7208588
局部常量地址为: 7208584
静态变量地址为: 4726788
请按任意键继续. . .
注意:
- 由输出可以看出全局变量常量静态变量都在同一个区,即全局区。
- (int)&b将b的地址转换成十进制。
1.4 栈区(程序运行后)
作用: 由编译器自动分配释放, 存放函数的参数值,局部变量等
// int*,返回值的数据类型是地址变量
int * funa()
{
int a = 1;
return &a;
}
int main() {
int *b = funb();
cout << *b << endl;
cout << *b << endl;
system("pause");
return 0;
}
结论: 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
1.5 堆区(程序运行后)
作用: 由程序员分配和手动释放,若程序员不释放,程序结束时由操作系统回收 使用: 主要利用new在堆区开辟内存数据。堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete。
int* func()
{
//开辟一个内容为1的指针
int* a = new int(1);
return a;
}
int main() {
int *a = funa();
cout << *a << endl;
cout << *a << endl;
//利用delete释放堆区数据
delete a;
//cout << *a << endl; //报错,已释放,不可访问
system("pause");
return 0;
}
注意: 利用new创建的数据,会返回该数据对应的类型的指针
- 同时也可以用它开辟一个数组
int main() {
//创建一个10个浮点型的数组,在堆区
float* a = new float[10];
for (int i = 0; i < 10; i++)
{
a[i] = i + 1.5;
}
for (int i = 0; i < 10; i++)
{
cout << a[i] <<" " ;
}
//释放数组 delete 后加 []
delete[] a;
system("pause");
return 0;
}
输出:
1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 10.5 请按任意键继续. . .