如何处理 C 中的堆栈数组分配失败?
Posted
技术标签:
【中文标题】如何处理 C 中的堆栈数组分配失败?【英文标题】:How to handle stack array allocation failure in C? 【发布时间】:2012-11-17 02:02:28 【问题描述】:如果我必须编写如下代码:
int a[10000000];
我知道代码有时会由于堆栈溢出而失败。问题是如何在运行时处理此类错误,避免segfault?
【问题讨论】:
在免费商店中分配。 一盎司的预防胜过一磅的治疗:) 不要在堆栈上分配数组,马上去免费存储。 你为什么要编写如下(即上面)的代码? 【参考方案1】:一般来说,堆栈溢出异常很难以优雅的方式处理。这是因为堆栈已经溢出了,为了让更多代码(甚至是异常处理代码)运行,需要有可用的堆栈空间。
一般来说,程序员设计程序时不会溢出堆栈。这涉及:
将分配在堆栈上的自动变量的大小保持在最低限度(如果需要大型数据结构,还可以使用其他类型的分配) 避免不必要的递归,如果使用递归,确保对最大深度有合理的限制如果您需要在函数内存储一千万个整数的空间,请不要在堆栈上分配它 - 使用 malloc()
或 new
分配它(取决于您实际使用的是 C 还是 C++)。当然,当你完成它时,free()
或 delete
也是你的责任。
如果您真的在使用 C++[1],那么您可能应该改用 std::vector
:
std::vector a(10000000);
底层标准库实现会在空闲存储区分配空间,并且会在你的函数返回时自动为你释放空间。
[1] 我希望人们不要仅仅因为它们拼写相似而用c 和c++ 标记问题。
【讨论】:
+11000 万作为脚注。 C 和 C++ 是不同的语言,具有不同的目标和理念,对一种语言适用的情况不一定适用于另一种语言。这就像将问题标记为 Java 和 C#。 我去掉了C++标签,虽然我觉得C++里也有栈的概念,和C里的栈没什么区别。 @Moeb:实际上,ISO C 标准从未提及“堆栈”一词。具有自动存储持续时间的对象以先进后出的方式分配和释放,但该机制未由语言指定。【参考方案2】:没有办法在运行时处理这个问题。在 C 中使用自动存储持续时间的对象的唯一理智、安全的方法是让它们足够小,以确保它们永远不会超过你知道你将拥有的堆栈数量(例如,永远不要使用超过 10% 或所以你期望拥有的东西)。
【讨论】:
如何找出程序的最大堆栈空间? 除非你在嵌入式系统上工作,否则它至少会是 100k 左右,所以坚持使用远低于这个值就可以了。使用堆栈的最佳经验法则是经典的说法“如果你不得不问,你买不起。”以上是关于如何处理 C 中的堆栈数组分配失败?的主要内容,如果未能解决你的问题,请参考以下文章