在 C++ 中增加堆栈大小

Posted

技术标签:

【中文标题】在 C++ 中增加堆栈大小【英文标题】:Increase stack size in c++ 【发布时间】:2017-03-02 15:43:48 【问题描述】:

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

附:我从 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();
    

【问题讨论】:

显然,如果你确定你的代码是正确的并且算法是完美的,那么问题肯定是编译器。 :) 谁写了delete temparray;?我希望不是这本书的作者。面对它。代码错误。 int tempArray[max_size]; 替换为int* tempArray = new int [max_size];。您的 delete 未定义,令人惊讶的是您并非每次都崩溃。 @Shahriyar Mammadli 代码可能来自一本书,但它仍然相当可怕。仅提及几件事;手动内存管理和拥有原始指针 - 不,使用智能指针。在任何地方都不要使用const。使用rand 这是一个非常糟糕 生成器 - 请改用random 设施。使用模数来获得分布 - 不要那样做,你会偏向你的数字。还有更多...溢出堆栈只是此代码的许多问题之一。 在递归函数中将 2MB 放入堆栈将快速终止程序。即使你增加堆栈大小,你也必须让它变得非常非常大。如上所述,动态分配是正确的方法。您应该能够通过仅在每次调用中分配您需要的内容来减少 temparray 中的内存使用。大小 = 最后 - 第一个。但是,无法通过自动分配来做到这一点。 【参考方案1】:

我已经解决了问题,它应该适用于我认为的所有 IDE,但它绝对适用于 Visual Studio。项目->属性->配置属性->链接器->系统->堆栈保留大小=4194304。这使得堆栈大小为 4 MB。

【讨论】:

您的代码仍然有问题。您不需要将自动变量 tempArray 作为堆栈上的数组。您需要一个指向使用int *tempArray = new int [max_size] 分配的数组的指针。这将符合您的声明delete[] tempArray。这消除了对大堆栈的需要。

以上是关于在 C++ 中增加堆栈大小的主要内容,如果未能解决你的问题,请参考以下文章

在 python 2.7 中增加递归限制和堆栈大小

增加堆栈保留大小并不能防止堆栈溢出

增加浏览器中的堆栈大小

使用mingw编译时增加堆栈大小?

如何在 C# 中增加堆栈大小? 1MB 是不够的。我有 32GB 的可用 RAM [重复]

在 Swi-prolog 中增加运行时的堆栈大小