在C++中增加堆栈大小

8

几天前我曾提出过这个问题,但并没有解决我的问题。我无法在Visual Studio中增加堆栈大小,我正在使用递归方法,输入较大时会导致堆栈溢出。我不能使用向量或其他东西。我需要的是在c++,Visual Studio中增加堆栈大小。

P.S. 我已经从Visual Studio配置中增加了堆栈保留大小,但它也没有解决我的问题。

void sorting:: MergeSort(int *theArray, int n) {


    mergesort(theArray, 0, n - 1);

}
void sorting::mergesort(int *theArray, int first, int last) {
    if (first < last) {

        int mid = (first + last) / 2;   // index of midpoint

        mergesort(theArray, first, mid);

        mergesort(theArray, mid + 1, last);

        // merge the two halves
        merge(theArray, first, mid, last);
    }
}  // end mergesort
void sorting::merge(int* theArray, int first, int mid, int last) {
    const int max_size = 500000;
    int tempArray[max_size];
    int first1 = first;     // beginning of first subarray
    int last1 = mid;        // end of first subarray
    int first2 = mid + 1;   // beginning of second subarray
    int last2 = last;       // end of second subarray
    int index = first1; // next available location in tempArray

    for (; (first1 <= last1) && (first2 <= last2); ++index) {
        if (theArray[first1] < theArray[first2]) {
            tempArray[index] = theArray[first1];
            ++first1;
        }
        else {
            tempArray[index] = theArray[first2];
            ++first2;
        }
    }
    // finish off the first subarray, if necessary
    for (; first1 <= last1; ++first1, ++index)
        tempArray[index] = theArray[first1];

    // finish off the second subarray, if necessary
    for (; first2 <= last2; ++first2, ++index)
        tempArray[index] = theArray[first2];

    // copy the result back into the original array
    for (index = first; index <= last; ++index)
        theArray[index] = tempArray[index];
    delete[] tempArray;
}  // end merge

我的主要功能。

  #include <iostream>
    #include <ctime>
    #include "sorting.h"

    using namespace std;



    int main()
    {
        sorting sort;
        int size = 500000;
        int *myArr=new int[size];

        for (int i = 0; i < size; i++) {
            myArr[i] = rand() % size;
        }
        cout << clock()<<"   ";
        sort.MergeSort(myArr,size);
        cout<<clock();
        cin.get();
    }

3
显然,如果你确定你的代码是正确无误的,算法也是完美的,那么问题一定是编译器出了问题。 :) - David Hoelzer
3
谁写的 delete temparray;?希望不是书的作者。承认吧,这段代码是错的。 - user4581301
6
int* tempArray = new int [max_size]; 替换 int tempArray[max_size];。你的delete未定义,令人惊讶的是你没每次都崩溃。 - molbdnilo
3
这段代码可能来自一本书,但它仍然相当糟糕。只说几点;手动内存管理和拥有裸指针——不行,使用智能指针。任何地方都没有使用 const。使用了 rand,这是一个极其糟糕的生成器——改用 random 工具库。使用模数获取分布——不要这样做,你会引入偏向。还有更多问题……这段代码存在许多问题之一就是栈溢出。 - Jesper Juhl
2
在递归函数中将2MB放入堆栈会迅速使程序崩溃。即使增加堆栈大小,也必须使其非常大。如上所述,动态分配是正确的方法。您应该能够通过仅在每次调用时分配所需的内容来减少temparray中的内存使用。size = last - first. 但不能使用自动分配来完成此操作。 - user4581301
显示剩余21条评论
1个回答

35

我已经解决了这个问题,我认为它应该在所有的IDE中都能工作,但它肯定可以在Visual Studio中工作。项目->属性->配置属性->链接器->系统->堆栈保留大小=4194304。这将使堆栈大小为4 MB。


4
你的代码仍有漏洞。你不需要将自动变量“tempArray”作为堆栈上的数组。你需要一个指向使用“int *tempArray = new int [max_size]”分配的数组的指针。这将与你的语句“delete[] tempArray”相匹配。这样可以避免使用大堆栈。 - harper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接