天天看点

C++ 核心 1.内存分区模型1. 内存分区模型

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 操作符

int * arr = new int[10];
for (int i=0; i < 10; i++){
    arr[i] = i + 100;
}
           
int * func() {
    int * p = new int(10);
    return p;
}
int main() {
    int *p = func();
    cout<< *p << endl;
    cout<< *p << endl;
}
           

继续阅读