局部数组过大直接触发栈溢出,因栈默认仅1~8mb(如windows约1mb、linux线程通常2mb),而int arr[1000000]占4mb,远超栈容量;应改用std::vector或std::unique_ptr在堆上分配。

局部数组太大直接触发栈溢出
函数内用 int arr[1000000] 这类大数组,几乎必然 SIGSEGV——不是访问越界,是根本没空间分配成功。栈默认只有 1~8MB(Linux 线程栈通常 2MB,Windows 主线程约 1MB),100 万个 int 就占 4MB,还没算其他局部变量和调用帧。
改用 std::vector 是最稳妥的方案
堆内存充足,且自动管理生命周期,语义清晰:
void process() {
std::vector<int> arr(1000000); // 分配在堆上
arr[0] = 42;
// 使用方式和数组几乎一样
}</int>
- 如果需要初始化为特定值,用
std::vector<int>(size, value)</int> - 避免写
std::vector<int> arr; arr.resize(1000000)</int>,多一次默认构造开销 - 不手动
new[]/delete[],除非你明确需要原始指针或兼容 C 接口
静态或全局数组?只适用于编译期确定、且不随函数调用变化的场景
比如查找表、常量配置:
static const int LUT[65536] = { /* ... */ };
-
static局部数组会放在数据段,不占栈,但所有调用共享同一份内存 - 不能依赖运行时大小:
static int arr[n];是非法的(C++ 不支持 VLA) - 多线程下若需可写,必须加锁,否则引发竞态
真要手管内存?优先用 std::unique_ptr 而非裸指针
当 vector 不适用(例如需对齐、自定义分配器、或与 C 函数交互):
auto ptr = std::make_unique<int>(1000000); ptr[0] = 42;</int>
-
std::make_unique<t>(n)</t>是唯一安全创建动态数组的方式,自动调用delete[] - 别用
new int[n]+ 手动delete[],异常路径下极易泄漏 -
std::unique_ptr比std::shared_ptr更轻量,无引用计数开销
栈空间不是用来存大数据的,哪怕你调大了 ulimit -s,也只是把问题推迟到更隐蔽的地方——比如某个递归深度大的路径突然崩掉。真正该问的不是“怎么让栈变大”,而是“这数据是否必须在栈上”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











