给全局变量动态分配内存的代码为何能正常运行?
#include <stdio.h> int* arr = new int[10]; int main() { for (int i = 0; i < 5; i++) { arr[i] = i; printf("%d", arr[i]); } return 0; }
运行输出:01234
原理说明
你产生误解的核心原因是混淆了C语言规则和C++规则,以及对全局变量初始化的阶段认知不完整:
- 首先上述代码是C代码(包含C语言不支持的
new关键字),C的全局变量初始化分为两个阶段:- 静态初始化阶段:针对编译期可确定值的常量初始化,该阶段在程序加载到内存时完成,早于程序运行逻辑执行,也就是你原本认知里的「初始化发生在程序运行前」的情况。
- 动态初始化阶段:针对非常量表达式的初始化,该阶段在
main函数执行前、程序运行环境已经准备完成后执行,代码中的int* arr = new int[10];就属于这个阶段的执行逻辑,new的内存分配操作此时正常调用,所以指针arr会指向合法的堆内存。
- 你原有认知的来源是C语言的规则:C语言要求全局变量必须用编译期常量初始化,要是用C写
int *arr = malloc(10*sizeof(int));会直接编译报错,但该规则不适用于C++。
注意事项
- 不同编译单元的全局变量动态初始化顺序没有明确标准,如果你在其他全局变量的初始化逻辑中引用
arr,可能出现arr还未完成初始化的问题,存在安全隐患。 - 全局
new申请的内存没有对应的delete[]释放,虽然程序退出时系统会自动回收堆内存,但不符合内存管理的最佳实践。
内容的提问来源于stack exchange,提问作者funckingcoding
相关产品推荐
相关产品推荐

