C++ 核心 1.内存分区模型
发布时间:2023-02-03 17:17:57 326
相关标签: # 数据
1. 内存分区模型
C++程序内存4个区:
- 代码区:函数体的二进制代码
- 全局区:全局变量、静态变量和常量
- 栈区:函数参数、局部变量。编译器分配。
- 堆区:程序员分配和释放。若不释放,程序结束后操作系统回收。
内存四区意义: 不同的生命周期,更灵活。
1.1 程序运行前
程序编译后,生成exe可执行程序,在执行程序前,已经有代码区、全局区。 代码区: 存放CPU执行的机器指令
- 代码区是共享的,因此频繁执行的程序,只要在内存里存一份。
- 代码区是只读的,避免程序被意外修改。
全局区: 存放全局变量、静态变量和字符串常量、全局常量。 该区域数据由操作系统控制。
函数体外的是全局变量。
static修饰的是静态变量:static int s_a = 0;
常量有字符串常量("hello"
),const修饰的全局变量(const int c_a = 10;
)。
1.3 程序运行后
栈区: 编译器分配,存放函数参数、局部变量等 注意:不要返回局部变量地址,因为栈区地址由编译器控制。 错误示范:
int * func() {
int a = 10;
return &a;
}
int main() {
int *p = func();
cout<< *p << endl;
cout<< *p << endl;
}
1.3 new 操作符
堆区:
程序员分配。
在C++中,用new在堆区开辟内存。
语法:new 数据类型
会返回该数据对应的类型指针,如果是数组,则返回第一个元素的地址。
e:
new 一个整型,值为10.
int * p = new int(10);
new 一个有10个元素的整型数组:
int * arr = new int[10]
int * arr = new int[10];
for (int i=0; i < 10; i++){
arr[i] = i + 100;
}
释放内存用delete
:
语法:
释放单个数据:
delete p;
释放数组:
delete[] arr;
示例:
int * func() {
int * p = new int(10);
return p;
}
int main() {
int *p = func();
cout<< *p << endl;
cout<< *p << endl;
}
文章来源: https://blog.51cto.com/pigeon/5781010
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报