C++ 核心 1.内存分区模型
  TEZNKK3IfmPf 2023年11月15日 31 0

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;
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   25天前   38   0   0 C++
  TEZNKK3IfmPf   25天前   26   0   0 指针C++
  TEZNKK3IfmPf   2024年05月31日   24   0   0 算法C++
TEZNKK3IfmPf