Как вызвать деструктор класса в алгоритме рекурсивной сортировки выбора? - PullRequest
0 голосов
/ 05 октября 2011
RecursiveSort::RecursiveSort(int myArray[], int first, int arraySize)
{
    int smallest = first, j;

    if (smallest < arraySize)
    {   
        smallest = first;
        for (j=first+1; j<arraySize; j++)
        {
            if (myArray[j] < myArray[smallest])
            {
                smallest = j;
            }
        }
        swap(myArray[first], myArray[smallest]);
        first++;
        RecursiveSort::RecursiveSort(myArray, first, arraySize);
    }
};

и в моем main (); я буду вызывать сортировку RecursiveSort (myArray, 0, arraySize);

Переполнение стека происходит, когда arraySize> 4000, и происходит сбой программы. Можно ли вызвать деструкторы классов где-нибудь, чтобы предотвратить переполнение стека? Я попытался использовать «релиз» вместо «отладка» (свойства проекта> менеджер конфигурации> раскрывающееся меню конфигурации). Однако это вызывает другие проблемы, когда я пытаюсь интегрировать библиотеку «TimeStamp_Lib.lib», которая используется для измерения того, сколько времени занимает сортировка.

Любые советы / предложения будут с благодарностью, спасибо!

Ответы [ 3 ]

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

Вы должны сделать эту функцию бесплатной, чтобы объекты не создавались.Если по какой-то причине алгоритм должен выполняться в конструкторе класса, вы можете вызвать его из конструктора.

Тем не менее, если компилятор не оптимизирует рекурсию в итерацию, рекурсия не подойдетдля алгоритмов, которые требуют углубления.Чтобы отсортировать 4000 целых чисел, ваша функция проходит 4000 уровней, что занимает много места в стеке.Для сравнения, быстрая сортировка идет на глубину log2 (4000) = 12 уровней.

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

В этой функции нет выделений - ваша проблема не в том, что вы выделили слишком много памяти.

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

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

Да, деструкторы могут быть вызваны вручную. Однако они уничтожают объект, не освобождают его память. Рекурсию легко представить в терминах, но она не так полезна в реальной жизни. Попробуйте переместить все ваши объекты в пул вне стека, или, что еще лучше, работайте итеративно.

...