导读:本期聚焦于小伙伴创作的《C++程序的内存布局是怎样的?C++中栈、堆、全局区和代码区如何划分》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++程序的内存布局是怎样的?C++中栈、堆、全局区和代码区如何划分》有用,将其分享出去将是对创作者最好的鼓励。

C++程序在运行时,操作系统会为其分配一块连续的内存空间,这块空间按照功能不同被划分为栈、堆、全局区和代码区四个部分,每个区域有独立的存储规则和使用场景。

C++程序的内存布局是怎样的?C++中栈、堆、全局区和代码区如何划分

一、代码区

代码区也叫文本段,主要存放程序编译后生成的机器指令,也就是我们编写的函数代码、逻辑语句编译后的二进制内容。这个区域是只读的,防止程序运行时意外修改指令逻辑,同时在多个相同程序运行时可以共享同一份代码区内容,节省内存开销。

比如我们编写的普通函数、类的成员函数,编译后都会存放在代码区,程序执行时CPU会从代码区读取指令依次运行。

二、全局区

全局区也叫静态区,主要存放全局变量、静态变量和常量。这个区域的内容在程序启动时就会分配内存,直到程序结束才会释放,生命周期贯穿整个程序运行过程。

全局区又可以分为两个部分:

  • 全局变量和静态变量存储区:存放所有在函数外定义的全局变量,以及用static关键字修饰的静态局部变量、静态全局变量。
  • 常量存储区:存放字符串常量和用const修饰的全局常量,这部分内容同样是只读的,不能被修改。

下面通过一个示例展示全局区的存储内容:

#include <iostream>
using namespace std;

// 全局变量,存放在全局区
int g_globalVar = 10;
// 静态全局变量,存放在全局区
static int s_staticGlobalVar = 20;
// 全局常量,存放在全局区常量存储区
const int g_constVar = 30;

int main() {
    // 静态局部变量,存放在全局区
    static int s_staticLocalVar = 40;
    cout << "全局变量地址: " << &g_globalVar << endl;
    cout << "静态全局变量地址: " << &s_staticGlobalVar << endl;
    cout << "全局常量地址: " << &g_constVar << endl;
    cout << "静态局部变量地址: " << &s_staticLocalVar << endl;
    return 0;
}

三、栈区

栈区由编译器自动分配和释放,主要存放函数的参数值、局部变量等。栈区的分配效率很高,但是空间大小有限,一般只有几兆字节,超过限制会导致栈溢出。

栈区的特点是后进先出,函数被调用时,会在栈顶为该函数分配一块栈帧,存放该函数的局部变量和参数,函数执行结束后,对应的栈帧会被自动释放,里面的内容不再有效。

需要注意的是,不要返回栈区变量的地址,因为函数结束后该地址的内容已经被释放,访问会得到不确定的结果:

#include <iostream>
using namespace std;

// 错误示例:返回栈区变量地址
int* getLocalVarAddr() {
    int localVar = 10; // localVar存放在栈区
    return &localVar; // 函数结束后localVar被释放,返回的地址无效
}

int main() {
    int* p = getLocalVarAddr();
    cout << *p << endl; // 访问无效地址,结果不确定
    return 0;
}

四、堆区

堆区也叫动态内存区,由开发者手动分配和释放,如果程序结束时没有手动释放,会被操作系统回收。堆区的空间大小远大于栈区,适合存储生命周期较长或者大小不确定的数据。

在C++中,我们使用new关键字在堆区分配内存,使用delete关键字释放内存,分配的内存地址可以传递给其他函数使用,不会像栈区变量那样随函数结束被释放。

堆区内存使用不当很容易出现内存泄漏、野指针等问题,需要特别注意:

#include <iostream>
using namespace std;

int main() {
    // 在堆区分配一个int大小的内存,返回地址给p
    int* p = new int(10);
    cout << "堆区变量值: " << *p << endl;
    cout << "堆区变量地址: " << p << endl;
    // 使用完后手动释放堆区内存
    delete p;
    p = nullptr; // 避免野指针
    return 0;
}

四个区域对比

我们可以通过下面的表格快速区分四个区域的核心差异:

区域名称存储内容分配方式释放方式生命周期
代码区函数机器指令编译时分配程序结束时释放整个程序运行期间
全局区全局变量、静态变量、常量编译时分配程序结束时释放整个程序运行期间
栈区局部变量、函数参数编译器自动分配函数结束时自动释放函数调用期间
堆区动态分配的数据开发者手动分配开发者手动释放或程序结束手动释放前

常见注意事项

  • 不要返回栈区变量的地址或引用,避免访问无效内存。
  • 堆区内存分配后一定要对应释放,防止内存泄漏,释放后及时将指针置为nullptr避免野指针。
  • 全局区的常量内容是只读的,尝试修改会导致程序崩溃。
  • 栈区空间有限,不要定义过大的局部变量数组,避免栈溢出。

C++内存布局全局区修改时间:2026-07-24 08:09:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。