#c #visual-studio #stack-overflow
#c #visual-studio #переполнение стека
Вопрос:
Я задавал этот вопрос пару дней назад, но это не решило мою проблему. Я не могу увеличить размер стека в Visual Studio, я использую рекурсивный метод, который получает большой объем входных данных и вызывает переполнение стека. Я не могу использовать vector или что-то еще. Что мне нужно, так это увеличить размер стека в c , Visual Studio.
PS Я увеличил размер стекового резерва из конфигурации 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) amp;amp; (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();
}
Комментарии:
1. Очевидно, что если вы уверены, что ваш код правильный и алгоритм безупречен, то проблема, должно быть, в компиляторе. 🙂
2. кто написал
delete temparray;
? Надеюсь, не автор книги. Взгляните правде в глаза. Неправильный код.3. Заменить
int tempArray[max_size];
наint* tempArray = new int [max_size];
. Вашdelete
не определен, и очень удивительно, что вы не зависаете каждый раз.4. @Shahriyar Mammadli Код может быть взят из книги, но он все равно довольно ужасен. Просто упомяну несколько вещей; ручное управление памятью и владение необработанными указателями — нет, используйте интеллектуальные указатели.
const
Нигде не используется. Использованиеrand
который является ужасно плохим генератором — используйтеrandom
средства вместо этого. Использование modulo для получения дистрибутива — не делайте этого, вы искажаете свои цифры. И это еще не все… Переполнение стека — это всего лишь одна из многих проблем с этим кодом.5. Добавление 2 МБ в стек в рекурсивной функции приведет к быстрой остановке программы. Даже если вы увеличите размер стека, вам придется сделать его очень, очень большим. Как указано выше, динамическое распределение — это правильный путь. Вы должны быть в состоянии уменьшить использование памяти в temparray, выделяя только то, что вам нужно при каждом вызове. размер = последний — первый. однако это невозможно сделать с помощью автоматического выделения.
Ответ №1:
Я решил проблему, я думаю, это должно работать во всех IDE, но это определенно работает в Visual Studio. ПРОЕКТ-> Свойства-> Свойства конфигурации-> Компоновщик-> Система-> Размер стекового резерва = 4194304 . Это делает размер стека 4 МБ.
Комментарии:
1. Ваш код по-прежнему содержит ошибки. Вам не нужна переменная auto
tempArray
в виде массива в стеке. Вам нужен указатель на массив, который выделяется с помощьюint *tempArray = new int [max_size]
. Это соответствовало бы вашему заявлениюdelete[] tempArray
. Это устраняет необходимость в большом стеке.