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”库时,这会导致其他问题,该库用于测量排序所需的时间。
非常感谢任何建议/意见,谢谢!
答案 0 :(得分:2)
你应该把它变成一个自由函数,所以不会创建任何对象。如果由于某种原因算法必须在类的构造函数中运行,则可以从构造函数中调用它。
尽管如此,除非编译器优化递归到迭代本身,否则递归将不适合需要深入的算法。要对4000个整数进行排序,您的函数会变为4000级深度,这会占用大量的堆栈空间。相比之下,快速排序会使log2(4000)= 12级深度。
答案 1 :(得分:1)
该功能没有分配 - 问题不在于您分配了太多内存。
我想你会复发很多次。这将需要某种形式的算法更改,或仅限制您可以使用此方法排序的项目数。如果你可以通过编译器可以优化掉递归的方式来改变它,那就行了(尽管它可能是特定于实现的)。更好的是,自己删除递归并将其更改为基于堆栈的循环。 Here's有关该
的更多信息答案 2 :(得分:0)
是的,可以手动调用析构函数。但是,它们会破坏一个物体,它们不会释放它的记忆。递归很容易被思考,但它在现实生活中并没有那么有用。尝试将所有对象移动到堆栈外的池中,或者更好地以迭代方式工作。