我查看了草案C++0x标准,据我所知其中没有任何关于栈溢出的内容。搜索“stack overflow”没有结果,搜索“stack”只有对栈展开和std::stack的引用。那是否意味着遇到本地对象(例如巨大的本地数组)耗尽内存时不允许处理错误的机制,因此无法实现符合C++标准的实现?
回答这个问题的答案表明至少C标准没有提到堆栈溢出。
为了使问题具体化,考虑以下程序:
编辑:问题并不是关于标准应该如何定义栈溢出时会发生什么,而是关于标准是否有规定,无论它是否存在。
回答这个问题的答案表明至少C标准没有提到堆栈溢出。
为了使问题具体化,考虑以下程序:
// Program A
int identity(int a) {
if (a == 0)
return 0;
char hugeArray[1024 * 1024 * 1024]; // 1 GB
return identity(a - 1) + 1;
}
int main() {
return f(1024 * 1024 * 1024);
}
而这个程序
// program B
int main() {
return 1024 * 1024 * 1024;
}
我认为C++标准不允许任何C++实现在这两个程序上做出明显不同的操作。实际上,由于程序A在栈上分配了1艾字节的内存(想象一下如果函数实际使用了巨大的数组,编译器就无法将其静默地删除而不产生任何问题),因此该程序在任何现代计算机上都无法运行。C++标准是否允许程序A失败?编辑:问题并不是关于标准应该如何定义栈溢出时会发生什么,而是关于标准是否有规定,无论它是否存在。
new char[HUGE]
失败,没错。但是如果你的源代码包含了数十亿个函数呢?而且这些函数都是完全有效的标准 C++ 代码... - Kerrek SB