«

1 内存分区模型

时间:2023-9-20 00:02     作者:wen     分类: C++


[toc]

内存分区模型

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


内存四区意义:

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

程序运行前

在程序编译后,生成exe可执行程序,未执行该程序前分为两个区域

代码区:

全局区:

#include <iostream>

using namespace std;

//  全局变量
int c_a = 10;
int c_b = 20;

// const 修饰的全局变量
const int c_g_a = 10;
const int c_g_b = 20;

int main()
{

    // 全局区

    // 全局变量, 静态变量, 常量
    cout << "全局变量c_a的地址: " << (int)&c_a << endl;
    cout << "全局变量c_b的地址: " << (int)&c_b << endl;

    // 静态变量
    static int s_a = 10;
    static int s_b = 20;
    cout << "静态变量s_a的地址: " << (int)&s_a << endl;
    cout << "静态变量s_b的地址: " << (int)&s_b << endl;

    // 常量
    // 字符串常量
    cout << "字符串常量的地址为: " << (int)&"hello world" << endl;
    // const 修饰的变量
    // const 修饰的全局变量
    cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;
    cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;
    // const 修饰的局部变量
    const int c_l_a = 10;
    const int c_l_b = 20;
    cout << "局部常量c_l_a地址为: " << (int)&c_l_a << endl;
    cout << "局部常量c_l_b地址为: " << (int)&c_l_b << endl;

    // 普通的局部变量
    int a = 10;
    int b = 20;

    cout << "局部变量a的地址: " << (int)&a << endl;
    cout << "局部变量b的地址: " << (int)&b << endl;

    system("pause");
    return 0;
}

/*
全局变量c_a的地址: -1260466096
全局变量c_b的地址: -1260466092
静态变量s_a的地址: -1260466088
静态变量s_b的地址: -1260466084
字符串常量的地址为: -1260474640
全局常量c_g_a地址为: -1260475292
全局常量c_g_b地址为: -1260475288
局部常量c_l_a地址为: 1654520292
局部常量c_l_b地址为: 1654520324
局部变量a的地址: 1654520356
局部变量b的地址: 1654520388
*/

总结:

程序运行后

栈区:

示例:

#include <iostream>

using namespace std;

int* func()
{
    int a = 10; // 局部变量,存放在栈区,栈区数据在函数执行完后自动释放

    return &a; // 返回局部变量的地址
}

int main()
{

    int* p = func();

    cout << *p << endl;
    cout << *p << endl;

    system("pause");
    return 0;
}

/*
10
1559136552
*/

堆区:

示例:

#include <iostream>

using namespace std;

int* func()
{
    // 利用关键字new,在堆区开辟数据
    // 指针: 本质也是局部变量, 放在栈上, 指针保存的数据放在堆区
    int* a = new int(10); 
    return a; 
}

int main()
{

    int* p = func();

    cout << *p << endl;
    cout << *p << endl;

    system("pause");
    return 0;
}

/*
10
10
*/

new操作符

C++中利用new操作符在堆区开辟数据

堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete

语法:new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

示例:基本语法

#include <iostream>

using namespace std;

int* func()
{
    // 利用关键字new,在堆区开辟数据
    // new返回时该数据类型的指针
    int* a = new int(10); 
    return a; 
}

void testA()
{
    // 堆区的数据由程序员管理释放
    // 如果想释放, 用关键字delete释放
    int* p = func();
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl;
    delete p;
    //cout << *p << endl; // 内存已被释放, 再次使用, 就是非法操作

}

// 在堆区利用new开辟数组
void testB()
{
    int* arr = new int[10]; //10 代表数组由10个元素
    for (int i = 0; i < 10; i++)
    {
        arr[i] = i + 100;
    }

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

    // 释放堆区数组
    // 释放数组的时候, 要加[]
    delete[] arr;

}

int main()
{

    //testA();
    testB();

    system("pause");
    return 0;
}

标签: C/C++ C++核心编程