C/C++ 内存分布与动态管理详解
在深入代码之前,我们先理清程序运行时的内存布局。理解这块'地盘'怎么划分,是避免内存泄漏和野指针的前提。
一、C/C++ 内存分布概览
通常我们将内存划分为以下几个主要区域:
- 栈区 (Stack):存放局部变量、函数参数等。由编译器自动管理,函数结束即释放。
- 堆区 (Heap):通过
malloc/new手动申请的空间。生命周期由程序员控制,需手动释放。 - 全局/静态区:存放全局变量、静态变量。程序启动时分配,结束时释放。
- 常量区:存放字符串字面量等不可修改数据。
- 代码区:存放二进制指令。
来看一段典型的代码示例,观察不同变量的存储位置:
#include <stdio.h>
#include <stdlib.h>
// 【全局/静态区】.data:已初始化的全局变量
int globalVar = 1;
// 【全局/静态区】.data:已初始化的静态全局变量
static int staticGlobalVar = 1;
void Test() {
// 【全局/静态区】.data:已初始化的静态局部变量(生命周期为整个程序)
static int staticVar = 1;
// 【栈区】:局部变量,函数运行结束自动释放
int localVar = 1;
// 【栈区】:局部数组
int num1[10] = {1, 2, 3, 4};
// 【栈区】:字符数组(注意:"abcd" 会被拷贝到栈上)
char char2[] = "abcd";
// 【指针在栈区】,但指向的 "abcd" 字符串字面量在【常量区/代码段】
const char* pChar3 = "abcd";
* ptr1 = (*)(() * );
* ptr2 = (*)(, ());
* ptr3 = (*)(ptr2, () * );
(ptr1);
(ptr3);
}




