如何在递归选择排序算法中调用类析构函数?

时间:2011-10-05 02:30:13

标签: c++ recursion tail-recursion

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);
    }
};

和我的主要();我将调用RecursiveSort sort(myArray,0,arraySize);

当arraySize&gt;存在堆栈溢出时4000,程序崩溃了。是否可以在某处调用类析构函数以防止堆栈溢出?我尝试使用“release”而不是“debug”(项目属性&gt;配置管理器&gt;配置下拉菜单)。但是,当我尝试集成“TimeStamp_Lib.lib”库时,这会导致其他问题,该库用于测量排序所需的时间。

非常感谢任何建议/意见,谢谢!

3 个答案:

答案 0 :(得分:2)

你应该把它变成一个自由函数,所以不会创建任何对象。如果由于某种原因算法必须在类的构造函数中运行,则可以从构造函数中调用它。

尽管如此,除非编译器优化递归到迭代本身,否则递归将不适合需要深入的算法。要对4000个整数进行排序,您的函数会变为4000级深度,这会占用大量的堆栈空间。相比之下,快速排序会使log2(4000)= 12级深度。

答案 1 :(得分:1)

该功能没有分配 - 问题不在于您分配了太多内存。

我想你会复发很多次。这将需要某种形式的算法更改,或仅限制您可以使用此方法排序的项目数。如果你可以通过编译器可以优化掉递归的方式来改变它,那就行了(尽管它可能是特定于实现的)。更好的是,自己删除递归并将其更改为基于堆栈的循环。 Here's有关该

的更多信息

答案 2 :(得分:0)

是的,可以手动调用析构函数。但是,它们会破坏一个物体,它们不会释放它的记忆。递归很容易被思考,但它在现实生活中并没有那么有用。尝试将所有对象移动到堆栈外的池中,或者更好地以迭代方式工作。