返回

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;
}
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
C++快速笔记 8 结构体 2023-02-03 16:37:15