【发布时间】:2015-02-02 17:38:32
【问题描述】:
考虑以下代码(仅用于演示目的):
#include <iostream>
int main()
{
char pixels[4][1280][720]; // Big enough to cause a stack overflow on my machine
for (unsigned int i = 0; i < 4; i++)
{
for (unsigned int j = 0; j < 1280; j++)
{
for (unsigned int k = 0; k < 720; k++)
{
pixels[i][j][k] = i + j + k;
}
}
}
std::cout << pixels[2][640][360];
return 0;
}
根据this question 上的回答,最大堆栈大小由Visual Studio 设置。
我是否正确假设它可以警告用户潜在的堆栈溢出? (我自己试过了,没有收到警告)
P.S:我问的唯一原因是因为我看到很多关于 SO 的问题可以通过这样的警告来避免(是的,我知道不是每个 SO 用户都使用 VS)。
【问题讨论】:
-
评估复杂代码以准确了解它在不执行的情况下会做什么是圣杯之一。不要抱太大希望。
-
你的意思是类似于 GCC
-Wstack-usage=1234? -
@Fanael 我的意思是如果数组的大小(以字节为单位)大于堆栈限制,那么肯定会发生堆栈溢出。所以它可以就此发出警告。是的,似乎就是这样。
-
+1,当我打开带有大量 SIMD 对象的激进内联时,我总是遇到这个问题。我宁愿编译器在编译时警告我而不是在运行时崩溃。
-
理论上是可以做到的。我这样做是为了在 IBM System/38 上实现 Pascal。问题是您实际上必须抛出异常,并且需要堆栈空间来处理,因此您必须为此“保留”大量堆栈。我发现如果你保留一半的堆栈用于异常处理,它确实只能以一种半途而废的方式发挥作用,而且,总的来说,在引发异常之前给应用程序更多的堆栈更有意义。
标签: c++ visual-studio stack-overflow