Разрешение StackOverFlowException в C ++ - PullRequest
1 голос
/ 05 октября 2011

Я пытаюсь написать программу для выбора сортировки элементов массива в C ++ (VS2010) с помощью рекурсии. Программа работает без проблем для небольших массивов, где размер массива меньше 10, когда я увеличиваю размер массива до 10000, я сталкиваюсь с исключением 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 ]

4 голосов
/ 05 октября 2011

Либо увеличьте размер стека (что можно сделать с помощью опции компоновщика STACK), либо - и это гораздо лучший вариант - улучшите или замените свой алгоритм. Похоже, рекурсивный алгоритм может не подходить для того типа данных, который вам нужно обрабатывать, но, возможно, вы можете улучшить ситуацию, используя меньшее количество локальных переменных и / или параметров в каждом вызове метода, чтобы уменьшить кадры стека.

2 голосов
/ 05 октября 2011

Вы либо используете много локального хранилища, либо ваши рекурсивные алгоритмы увеличивают использование памяти при последующих вызовах.В любом случае, вероятно, итеративное решение решит ваши проблемы.

1 голос
/ 05 октября 2011

Локальные переменные, как вы, возможно, знаете, хранятся в стеке.

Когда функция возвращается, локальные переменные из каждого вызова остаются в стеке до тех пор, пока выполняются их соответствующие функции.Если вы наберете слишком много ресурсов, сборка будет слишком большой, и вы, скорее всего, получите исключение переполнения стека, например, когда вы получаете, или ошибку сегментации, когда стек переполняется в защищенную память.

Это принципиально, и нет другого пути, кроме как увеличить объем доступной памяти или переписать вашу функцию, чтобы она стала итеративной.

...