内存四区—C++
一、栈区
1、栈区的数据由编译器自动分配释放;
2、栈区主要存放函数的参数、局部变量等。
注意事项:不要返回局部变量的地址。
#include <iostream>
using namespace std;
int* func(int i) {
int a = 10;
return &a;//返回了形参的地址
}
int main() {
int* p=func(1);
//打印结果为10
cout << *p << endl;//第一次可以打印正确的数字是因为编译器做了保留
//打印结果为垃圾值
cout << *p << endl;//第二次这个数据就不再保留了,打印出来的是垃圾值
system("pause");
return 0;
}
二、堆区
1、堆区数据由程序员管理开辟和释放
2、堆区数据由new关键字进行开辟内存
#include <iostream>
using namespace std;
int* func(int i) {
int* p = new int(10);
return p;
}
int main() {
int* p=func(1);
cout << *p << endl;//打印结果为10
cout << *p << endl;//打印结果为10
system("pause");
return 0;
}
new / delete运算符
new运算符的基本语法:
1、在堆区创建数据
2、new返回的是该数据类型的指针
//用new创建数据
int* p=new int;
int* p=new int(10);
//用new开辟数组
int *arr=new int[10];
delete运算符的基本用法:释放在堆区开辟的内存
delete p;
delete[] p;
完整代码示例:
#include <iostream>
using namespace std;
int main() {
int* p1 = new int(20);
cout << *p1 << endl;//打印结果为20
delete p1;
int* p2 = new int[10];
for (int i = 0; i < 10; i++) {
p2[i] = 10 + i;
}
for (int i = 0; i < 10; i++) {
cout << p2[i] << ' ';//打印结果为10 11 12 13 14 15 16 17 18 19
}
delete[] p2;
system("pause");
return 0;
}
三、代码区
1、存放CPU执行的机器命令;
2、代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可;
3、代码区是只读的,时期只读的原因是防止程序意外地修改了它的指令。
四、全局区
1、全局区包含全局变量和静态变量;
2、全局区还包含了常量区(const修饰的全局常量)、字符串常量和其他常量;
3、该区域的数据在程序结束后由操作系统释放。