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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
SEVI
31 / 30 / 0
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 00:17     "Stack overflow" как обойти? #1
Доброго времени суток!
Дело в том, что при объявлении массива размером 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;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 00:26     "Stack overflow" как обойти? #2
А в настройках компилятора ничего не меняли? Нормально принял VC++2012 ваш код. Я сам создавал массивы большей длины, тема до боли знакома. Но вы вроде к пределам возможностей 32 разрядной системы и близко не подошли.
SEVI
31 / 30 / 0
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 00:35  [ТС]     "Stack overflow" как обойти? #3
mustimur, а вы в коде меняли на 1000000? А то я оставил случайно 100000... У меня VC++2013. Настроек не менял...
Craw
 Аватар для Craw
233 / 44 / 4
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
27.01.2014, 00:36     "Stack overflow" как обойти? #4
Проверьте, возможно где-то в файле есть число, большее чем 231-1 (2 147 483 647). Либо n>106.
SEVI
31 / 30 / 0
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 00:38  [ТС]     "Stack overflow" как обойти? #5
Craw, да вот в том то и дело что чисел 6. И они все не привышают 100. И проблема начинается еще до заполнения. И как я говорил проблема пропадает, когда я меняю с 106 на 105...
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 00:45     "Stack overflow" как обойти? #6
Цитата Сообщение от SEVI Посмотреть сообщение
mustimur, а вы в коде меняли на 1000000? А то я оставил случайно 100000... У меня VC++2013. Настроек не менял...
Да тоже начал вылетать, но если записать так то работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
 
int main()
{
    int n, k, i, s=0;
    int *a=new int[1000000];
    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;
     delete [] a;
     return 0;
}
Добавлено через 4 минуты
16 строчку раскоментировать забыл
SEVI
31 / 30 / 0
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 00:47  [ТС]     "Stack overflow" как обойти? #7
mustimur, хм... интересно... а почему же тогда не работает тот вид записи... Спасибо! Учту...
Может я ошибаюсь, но этот вид записи используется при динамическом программировании... И получается память выделяется по мере заполнения?
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 00:54     "Stack overflow" как обойти? #8
Цитата Сообщение от SEVI Посмотреть сообщение
Может я ошибаюсь, но этот вид записи используется при динамическом программировании... И получается память выделяется по мере заполнения?
Да это динамический массив, но память по него выделяется полностью и сразу в момент определения, в данном случае когда программа доходит до 9 строчки, а освобождается на 21 строчке.
SEVI
31 / 30 / 0
Регистрация: 26.01.2010
Сообщений: 124
Записей в блоге: 1
27.01.2014, 01:10  [ТС]     "Stack overflow" как обойти? #9
mustimur, кстати говоря у меня работает только без
C++
1
delete [] a;
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 01:15     "Stack overflow" как обойти? #10
А с ней ошибку выдает? Это строчка освобождения памяти выделенного под массив. В данном случае не обязательна так память освободится после выполнения программы, но если ты допустим организуешь цикл объявление, то это чревато утечками памяти
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.01.2014, 08:30     "Stack overflow" как обойти? #11
Должно быть полезно Почему прога может зависать при инициализации массива
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 10:35     "Stack overflow" как обойти? #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Должно быть полезно Почему прога может зависать при инициализации массива
А думаете целесообразно менять размер стека? Я не рискнул бы давать такой совет, лучше память выделять динамически на кучи.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.01.2014, 10:40     "Stack overflow" как обойти? #13
Цитата Сообщение от mustimur Посмотреть сообщение
А думаете целесообразно менять размер стека?
Я и не рекомендую менять этот размер. См сообщение: Почему прога может зависать при инициализации массива
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 10:46     "Stack overflow" как обойти? #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Я и не рекомендую менять этот размер.
Извините не внимательно прочел , просто общая мысль той темы изменение размера стека. Вы то как раз даете рекомендацию аналогично моей
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.01.2014, 10:49     "Stack overflow" как обойти? #15
mustimur, решений проблемы может быть несколько. Самое простое - изменить размер стека, но при этом оно не самое правильное.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
27.01.2014, 11:27     "Stack overflow" как обойти? #16
SEVI, что тебе мешает выделить память под массив динамически?
Очевидно же что не хватает стековой памяти.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 11:27     "Stack overflow" как обойти? #17
Цитата Сообщение от Tulosba Посмотреть сообщение
mustimur, решений проблемы может быть несколько.
Я это прекрасно понимаю.
Цитата Сообщение от Tulosba Посмотреть сообщение
Самое простое - изменить размер стека, но при этом оно не самое правильное.
И тоже ясно, поэтому такой совет и дал.
Сформулирую иначе есть случаи в которых менять размер стека целесообразно по вашему? (если можно пример)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.01.2014, 12:15     "Stack overflow" как обойти? #18
Цитата Сообщение от mustimur Посмотреть сообщение
есть случаи в которых менять размер стека целесообразно по вашему?
Если есть время и возможность переписать код, не увеличивая размер стека, то лучше так и сделать.
Иначе:
1. Когда есть готовая программа, требующая бОльшего стека.
2. Использование памяти на стеке быстрее, чем частое выделение/освобождение в куче. Хотя даже в этом случае можно выделить достаточный буфер в куче один раз и использовать его. Т.е. по сути сделать свой стек с блекджеком в куче.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
27.01.2014, 12:59     "Stack overflow" как обойти? #19
Цитата Сообщение от Tulosba Посмотреть сообщение
Если есть время и возможность переписать код, не увеличивая размер стека, то лучше так и сделать.
Спасибо, в принципе так и думал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2014, 16:01     "Stack overflow" как обойти?
Еще ссылки по теме:

Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun" C++
C++ Ошибка "stack overflow". Разложение функции в ряд Тейлора
C++ Ошибка "Stack around the variable 'a' was corrupted" при завершении программы

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

Или воспользуйтесь поиском по форуму:
h8er
15 / 15 / 5
Регистрация: 20.11.2013
Сообщений: 92
27.01.2014, 16:01     "Stack overflow" как обойти? #20
Цитата Сообщение от Tulosba Посмотреть сообщение
mustimur, решений проблемы может быть несколько. Самое простое - изменить размер стека, но при этом оно не самое правильное.
Скажите, пожалуйста, почему изменять размер стека не самое целесообразное решение? И почему его лучше вообще не трогать? Если я правильно понимаю, то в защищенном режиме процессора ОС(в частности Windows 32bit), предоставляет памяти 4Гб, и если речь идет об объектах разумных размеров (скажем, до 100 мб), то для повышения быстродействия можно было бы использовать увеличенный стек, повысив тем самым скорость работы в 2 раза, по сравнению с кучей? Тогда по каким причинам так не поступают?
Yandex
Объявления
27.01.2014, 16:01     "Stack overflow" как обойти?
Ответ Создать тему
Опции темы

Текущее время: 02:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru