在C ++中解决StackOverFlowException

时间:2011-10-04 23:36:08

标签: c++ stack-overflow

我正在尝试使用递归编写一个程序,用于在C ++(VS2010)中选择数组元素。对于较小的数组,当我将数组的大小增加到10000时,该程序的工作没有任何问题,因为数组的大小小于10我面临stackoverflow异常。我该如何解决这个问题?

感谢您到目前为止的答案。我的想法不是对数组进行排序,而是使用递归对大型数组进行排序,然后点击stackoverflow异常。这个练习背后的主要思想是学习解决stackoverflow异常的方法,而不是排序数组。

selectionSortRecursive(int a[], int startindex, int endindex)
{
    if (startindex<endindex)
    {
        int s = startindex;
        for (int index=startindex+1;index<endindex;index++)
        {
            if (a[s]>a[index])
                s=index;
        }
        if (s>startindex)
        {
            a[s]=a[startindex]+a[s];
            a[startindex]=a[s]-a[startindex];
            a[s]=a[s]-a[startindex];
        }
        selectionSortRecursive(a, startindex+1, endindex);
    }

}

3 个答案:

答案 0 :(得分:4)

增加堆栈的大小(可以使用STACK链接器选项完成)或 - 这是一个更好的选择 - 改进或替换算法。听起来像递归算法可能不适合您需要处理的数据类型,但也许您可以通过在每个方法调用中使用更少的局部变量和/或参数来改进,以使堆栈帧更小。

答案 1 :(得分:2)

您要么使用大量本地存储,要么递归算法会在后续调用中爆炸内存使用。无论哪种情况,迭代解决方案都可能解决您的问题。

答案 2 :(得分:1)

您可能知道,局部变量会保留在堆栈中。

当函数递归时,只要各自的函数执行,每个调用的局部变量就会保留在堆栈中。如果你进行过多的计算,那么构建会太大,你最终可能会遇到堆栈溢出异常,就像你得到的那样,或者是一个分段错误,堆栈溢出到受保护的内存中。

这是基础,除了增加可用内存或重写函数以进行迭代之外,没有别的办法。