跳转至

程序的内存模型

C++ 程序在执行的时候,将内存大方向划分为4个区域

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的。
  • 全局区:存放全局变量和静态变量以及常量。
  • 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

内存四区的意义

不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。

代码区

  • 存放CPU执行的机器指令。
  • 代码区是共享的,目的是对于被频繁执行的程序,只需要在内存中有一份代码即可。
  • 代码区是只读的,防止程序意外的修改了它的指令。

全局区

  • 全局变量静态变量存放于此。
  • 全局区还包含了:常量区、字符串常量和其它常量。
  • 该区域的数据在程序结束后由操作系统释放。

栈区

  • 由编译器自动分配释放、存放函数的参数值,局部变量等。

注意:

不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。

堆区

由程序员分配释放,程序结束后由操作系统回收,在C++中主要使用new运算符在堆区开辟内存。

#include <iostream>
using namespace std;

int * fuction (){
    // 使用new关键字,可以将数据开辟至堆区
    int * p = new int(10);
    return p;
}

int main() {

    int * p = fuction();

    cout << *p << endl;

    system("pause");
    return 0;
}

 在函数中,指针本质上也是一个变量,存放在栈区;函数运行完毕后就会被释放,而存放在栈区的指针指向的是由程序员自行分配的堆区中数据的地址,因此程序返回的地址是在堆区中的地址。

new 运算符

在C++中,使用new运算符在堆区开辟数据。

堆区开辟的数据由程序员手动开辟,手动释放。

释放利用操作符delete

语法: new 数据类型

使用new创建的数据,会返回其对应类型的指针。

  • 在堆区开辟数组
int * fuction (){
    // 使用new在堆区开辟数组
    int * arr = new int[10];

    for (int i = 0; i < 10; i++){
        arr[i] = i + 100;
    }
    return arr;

    // 释放堆区数组
    delete[] arr;
}