3

如果我必须编写如下代码:

int a[10000000];

我知道代码有时可能会由于堆栈溢出而失败。问题是如何在运行时处理此类错误,并避免段错误?

4

2 回答 2

6

一般来说,堆栈溢出异常很难以优雅的方式处理。这是因为堆栈已经溢出,为了运行更多代码(甚至是异常处理代码),需要有可用的堆栈空间。

通常,程序员设计程序时不会溢出堆栈。这涉及:

  • 将分配在堆栈上的自动变量的大小保持在最低限度(如果需要大型数据结构,则使用其他类型的分配)
  • 避免不必要的递归,如果使用递归,确保对最大深度有合理的约束

如果您需要在函数内存储一千万个整数的空间,请不要在堆栈上分配它 - 使用malloc()or分配它new(取决于您实际使用的是 C 还是 C++)。当然,当你完成它时,free()它也是你的责任。delete

如果您真的在使用 C++ [1],那么您可能应该使用std::vector

std::vector a(10000000);

底层标准库实现将在空闲存储上分配空间,在您的函数返回时自动为您解除分配。

[1] 我希望人们不要仅仅因为拼写相似而用

于 2012-11-29T03:28:21.577 回答
2

在运行时没有办法处理这个问题。在 C 中使用自动存储持续时间的对象的唯一理智、安全的方法是让它们足够小,以确保它们永远不会超过你知道你将拥有的堆栈数量(例如,永远不要使用超过 10% 或所以你期望拥有的东西)。

于 2012-11-29T03:28:20.557 回答