资料来源
https://www.bilibili.com/video/BV1et411b73Z?p=84&vd_source=cc561849591f6a210152150b2493f6f3
核心内容
程序的内存模型
代码区
全局区
在函数外面声明了全局变量,在main函数里面创建了局部变量,打印了其地址:
静态变量:在普通变量前面加一个static,属于静态变量。静态变量也属于全局变量。
全局区域内有:全局变量、静态变量、常量。
常量有:字符串常量、const修饰的全局变量(全局常量)、const修饰局部变量(局部常量,不放在全局区)。
栈区
栈区:
- 由编译器自动分配,存放函数的参数值,局部变量等。
- 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
- 局部变量、形参等数据会放在栈区。
int* run() {
int a = 1;
return &a;
}
int main()
{
int* a = run();
cout << *a << endl;
cout << *a << endl;
return 0;
}
第一次能打印,是编译器做了保留;第二次就不保留了。
堆区
堆区:
- 由程序员分配释放,若程序员不释放,则程序结束时由操作系统回收。
- C++中主要用于new来开辟内存。
int* run() {
//用new将数据开辟到堆区
int a = 1;
//指针变量p放在栈区,但是其指向的数据在堆区
int* p = new int(10);
return p;
}
int main()
{
int* a = run();
cout << *a << endl;
cout << *a << endl;
return 0;
}
new运算符
- new在堆区开辟数据
- 开辟的数据需要由程序员手动释放,释放用delete
- new返回的是开辟的数据在堆区的地址
int main()
{
int* arr = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = i + 101;
}
for (int i = 0; i < 10; i++) {
cout << arr[i] << endl;
}
//释放堆区的数组
delete[] arr;//必须加[],否则只会释放一个数据
return 0;
}
发现不加[]时,剩下9个数组元素的值虽然能访问,但是其值变了: