Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
SEVI
31 / 30 / 0
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
#1

"Stack overflow" как обойти? - C++

27.01.2014, 00:17. Просмотров 1553. Ответов 40
Метки нет (Все метки)

Доброго времени суток!
Дело в том, что при объявлении массива размером 106
C++
1
int a[1000000];
выскакивает при запуске (после компиляции даже) stack overflow, еще до того как туда будут заноситься элементы. Дебаггер указывает именно сюда... Тем более если сделать 105, то все работает... Прошу объяснить как это обойти... Заранее спасибо.
Вот весь код (без кода функции двоичной сортировки quickSortR)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    int n, k, i, s=0;
    int a[100000];
    ifstream f1("E.dat");
    ofstream f2("E.sol");
    f1 >> n >> k;
    for (i = 0; i < n; i++) {
        f1 >> a[i];
    }
    quickSortR(a,n-1);
    for (i = k; i < n; i++) {
        s = s + a[i];
    }
    f2 << s;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2014, 00:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "Stack overflow" как обойти? (C++):

Ошибка "stack overflow". Разложение функции в ряд Тейлора - C++
Задание: рекурентно реализовать разложение ф-ии {\sin}^{2} по ряду Тэйлора. Выдает ошибку &quot;Необработанное исключение в &quot;0x00cc18a9&quot; в...

Быстрая сортировка: ошибка "Stack overflow" - C++
Не понмаю, пишет STACK OVERFLOUDED!!!! не знаю в чем проблема. #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;time.h&gt; using...

Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun" - C++
Не могу понять почему значение ChoiceOfPlayer меняется и почему NumberOfRow и NumberOfColumn всегда последние значение цикла. Помогите...

Как отследить ошибку "Stack around the variable was corrupted."? - C++
Вообщем код большой. Несколько классов, десяток функций. Ошибка всплывает только после завершения функции main(). Вот как бы научить...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? - C++
Читаю файл в структуру, double Fdat; struct STR { ... } rec

40
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
27.01.2014, 11:27 #16
SEVI, что тебе мешает выделить память под массив динамически?
Очевидно же что не хватает стековой памяти.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 11:27 #17
Цитата Сообщение от Tulosba Посмотреть сообщение
mustimur, решений проблемы может быть несколько.
Я это прекрасно понимаю.
Цитата Сообщение от Tulosba Посмотреть сообщение
Самое простое - изменить размер стека, но при этом оно не самое правильное.
И тоже ясно, поэтому такой совет и дал.
Сформулирую иначе есть случаи в которых менять размер стека целесообразно по вашему? (если можно пример)
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.01.2014, 12:15 #18
Цитата Сообщение от mustimur Посмотреть сообщение
есть случаи в которых менять размер стека целесообразно по вашему?
Если есть время и возможность переписать код, не увеличивая размер стека, то лучше так и сделать.
Иначе:
1. Когда есть готовая программа, требующая бОльшего стека.
2. Использование памяти на стеке быстрее, чем частое выделение/освобождение в куче. Хотя даже в этом случае можно выделить достаточный буфер в куче один раз и использовать его. Т.е. по сути сделать свой стек с блекджеком в куче.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 12:59 #19
Цитата Сообщение от Tulosba Посмотреть сообщение
Если есть время и возможность переписать код, не увеличивая размер стека, то лучше так и сделать.
Спасибо, в принципе так и думал
0
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 16:01 #20
Цитата Сообщение от Tulosba Посмотреть сообщение
mustimur, решений проблемы может быть несколько. Самое простое - изменить размер стека, но при этом оно не самое правильное.
Скажите, пожалуйста, почему изменять размер стека не самое целесообразное решение? И почему его лучше вообще не трогать? Если я правильно понимаю, то в защищенном режиме процессора ОС(в частности Windows 32bit), предоставляет памяти 4Гб, и если речь идет об объектах разумных размеров (скажем, до 100 мб), то для повышения быстродействия можно было бы использовать увеличенный стек, повысив тем самым скорость работы в 2 раза, по сравнению с кучей? Тогда по каким причинам так не поступают?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.01.2014, 16:14 #21
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
1. стек должен быть непрерывным, в то время как для кучи такого требования нет. Непрерывный кусок памяти заданного размера найти иногда просто невозможно в силу фрагментирования памяти.
2. со стеком не реализовать логику случайного освобождения памяти (в терминалогии стека, есть только адрес его вершины). Нельзя освободить память из середины стека, не тронув вершину.
3. про скорость довольно сомнительно. Если есть много мелких объектов, которые нужно создавать/уничтожать, можно выделить пул и работать с ним.
5
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 17:41 #22
Цитата Сообщение от h8er Посмотреть сообщение
то для повышения быстродействия можно было бы использовать увеличенный стек, повысив тем самым скорость работы в 2 раза, по сравнению с кучей
Это хорошо если ты заранее знаешь свой предел, а если он переменен? Заранее объявлять с запасом и оттягивать на свою программу излишние ресурсы, тогда с каким запасом? Да кстати проблемы начнутся уже на 2Гб под win32 (по умолчанию)... Плюс если я правильно понимаю то основная потеря времени это на выделение и освобождение памяти, тогда не создавайте и освобождайте память многократно, а сделайте это единожды, тогда потери скорости не должно быть существенной (если вообще будет).
0
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 18:02 #23
Цитата Сообщение от mustimur Посмотреть сообщение
основная потеря времени это на выделение и освобождение памяти
Не только на выделение и освобождение, а в принципе доступ к ячейке на стеке в 2 раза быстрее, чем на куче. На ячейку на стеке указывает регистр и адрес уже известен, тогда как для доступа к ячейке в куче требуется высчитывать местоположение: адрес начало блока памяти + смещение до этой ячейки.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 18:48 #24
Цитата Сообщение от h8er Посмотреть сообщение
Не только на выделение и освобождение, а в принципе доступ к ячейке на стеке в 2 раза быстрее, чем на куче. На ячейку на стеке указывает регистр и адрес уже известен, тогда как для доступа к ячейке в куче требуется высчитывать местоположение: адрес начало блока памяти + смещение до этой ячейки.
Допустим, но что то сомнительно это, если ссылка где проводится сравнение? там что я видел нет однозначного ответа на быстродействие.
0
Убежденный
Ушел с форума
Эксперт С++
15691 / 7201 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
27.01.2014, 18:51 #25
Ко всему написанному хотелось бы добавить, что в Windows ситуацию с
переполнением стека можно отловить через SetUnhandledExceptionFilter.
Вот только радости от этого немного, т.к. в обработчике ничего
серьезного выполнить не выйдет, ибо стековой памяти уже нет...
1
ValeryS
Модератор
6681 / 5090 / 477
Регистрация: 14.02.2011
Сообщений: 17,090
27.01.2014, 18:56 #26
Цитата Сообщение от SEVI Посмотреть сообщение
int a[1000000];
итого выделяем 4000000 байт памяти примерно 4МБайта
а размер стека 1 Мб

Добавлено через 3 минуты
Цитата Сообщение от h8er Посмотреть сообщение
Не только на выделение и освобождение, а в принципе доступ к ячейке на стеке в 2 раза быстрее, чем на куче. На ячейку на стеке указывает регистр и адрес уже известен, тогда как для доступа к ячейке в куче требуется высчитывать местоположение: адрес начало блока памяти + смещение до этой ячейки.
хоть раз смотрел на листинги?
[ebp+x] или [esp-x] для стека
[esi+x] для кучи
где тут быстрее?
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 19:00 #27
Так какой вывод? для я себя сделал выбор в пользу кучи и динамической памяти (как и советует Tulosba), но по скорости я все таки проигрываю?

Добавлено через 47 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
хоть раз смотрел на листинги?
[ebp+x] или [esp-x] для стека
[esi+x] для кучи
где тут быстрее?
вот я это тоже видел!!
0
ValeryS
Модератор
6681 / 5090 / 477
Регистрация: 14.02.2011
Сообщений: 17,090
27.01.2014, 19:01 #28
Цитата Сообщение от mustimur Посмотреть сообщение
для я себя сделал выбор в пользу кучи и динамической памяти
правильно
Цитата Сообщение от mustimur Посмотреть сообщение
но по скорости я все таки проигрываю?
с чего бы? посмотри листинг и увидишь что нет
а при последовательном доступе даже выиграешь
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 19:10 #29
Цитата Сообщение от ValeryS Посмотреть сообщение
с чего бы? посмотри листинг и увидишь что нет
а при последовательном доступе даже выиграешь
Смутил на храп h8er-а, думал новичок проглядел что-то...

Добавлено через 5 минут
в смысле я новичок, проглядел чего-то)
0
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 19:30 #30
Цитата Сообщение от ValeryS Посмотреть сообщение

хоть раз смотрел на листинги?
[ebp+x] или [esp-x] для стека
[esi+x] для кучи
где тут быстрее?
Что этим куском коды вы хотели доказать, я так и не понял, но я хотел донести всего лишь мысль, что для доступа к ячейки на стеке в общих чертах требуется один такт, для кучи - 2. Вот и вся моя мысль.
0
27.01.2014, 19:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2014, 19:30
Привет! Вот еще темы с ответами:

Предупреждение компилятора "integer overflow in expression" - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { int a, b; double c;

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Ошибка "pow : OVERFLOW error" - C++
Вот функция , x записать как константу, b вводить з клавиатуры. А вот код но он не пашет, пашет только первый две функции а дальше ошибка....

Ошибка "pow() overflow error" - C++
Помогите плз составить код на C++ Я начал составлять но столкнулся с проблемой pow overflow error Вот код, который я написал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru