Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.
Здравствуйте, <Аноним>, Вы писали:
А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.
Заюзай связанный список, память будет распределена равномерно...
Здравствуйте, Аноним, Вы писали:
А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.
При компиляции проги в VC можно указать максимальный размер стэка.(в пределах разумного, конечно). Разумное — по-моему, 2 МБ...
А может не на стэке выделять память, а динамически? new/delete?
> Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.
используй std::vector<T> и его .reserve(...) или конструктор (если размер известен)
Posted via RSDN NNTP Server 1.9 beta
Re: Stack overflow
От:
Аноним
Дата:
29.06.04 06:21
Оценка:
А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение?
Мне кажется, добиться того же результата можно и без бесконечно рекурсии — если ее глубина будет достаточной (допустим, несколько миллионов). При этом необязательно большие объекты создавать.
> А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? > > Мне кажется, добиться того же результата можно и без бесконечно рекурсии — если ее глубина будет достаточной (допустим, несколько миллионов). При этом необязательно большие объекты создавать.
и вообще, можно заюзать стэк функторов (std::stack<Something>) вместо реального вызова рекурсивных функций или методов
Здравствуйте, Аноним, Вы писали:
А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.
Одна из причин stack overflow — это перерасход стека:
— большой размер переменных
— большая глубина рекурсии
— малый размер стека (который можно указывать при запуске потока)
Вторая причина — расстрел памяти.
На архитектуре x86/286/ia32 принято использовать два указателя стека: ss:sp/esp (stack pointer) и ss:bp/ebp (base pointer).
Кадр стека функции выглядит так
стек регистры команды авторство
arg_n push arg_n вызывающая сторона
... ... ...
arg_1 push arg_1 ...
old_eip call new_eip вызывающая сторона
old_ebp push ebp функция
var_1 <--- ebp mov ebp, esp ...
... ...
var_k ...
<--- esp sub esp, sizes функция
Команды { push ebp; mov ebp, esp; sub esp, k } можно сделать вообще одной командой { enter k,1 }.
В дальнейшем стек ещё растёт вниз при разных вычислениях, возвращается к исходному состоянию и т.д.
При выходе из функции производится освобождение переменных:
mov esp, ebp | leave
pop ebp |
ret | ret n
Теперь представим себе, что old_ebp расстрелян.
После leave, регистр ebp содержит мусор. После второго leave этот мусор оказывается в esp.
Перекуём баги на фичи!
Re[2]: Stack overflow
От:
Аноним
Дата:
29.06.04 11:23
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.
К>Одна из причин stack overflow — это перерасход стека К>...