Stack overflow
От: Аноним  
Дата: 28.06.04 21:09
Оценка:
Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.
Re: Stack overflow
От: Astaroth Россия  
Дата: 28.06.04 21:25
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.


Заюзай связанный список, память будет распределена равномерно...
http://livejournal.com/users/breqwas
Re: Stack overflow
От: denisku Россия  
Дата: 28.06.04 21:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.


При компиляции проги в VC можно указать максимальный размер стэка.(в пределах разумного, конечно). Разумное — по-моему, 2 МБ...

А может не на стэке выделять память, а динамически? new/delete?
Извините за потраченный траффик..
Re: Stack overflow
От: zelyony  
Дата: 29.06.04 05:37
Оценка:
> Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение? И что делать, если все-таки нужен массив именно в памяти именно на метр (+/- кепка-500Кб)? Или киньте ссылочку на досуге почитать, сам в мсдн не нашел.

используй std::vector<T> и его .reserve(...) или конструктор (если размер известен)
Posted via RSDN NNTP Server 1.9 beta
Re: Stack overflow
От: Аноним  
Дата: 29.06.04 06:21
Оценка:
А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение?

Мне кажется, добиться того же результата можно и без бесконечно рекурсии — если ее глубина будет достаточной (допустим, несколько миллионов). При этом необязательно большие объекты создавать.
Re[2]: Stack overflow
От: zelyony  
Дата: 29.06.04 06:26
Оценка:
> А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 1Мб и бесконечной рекурсии, может прога вылетать в такое исключение?
>
> Мне кажется, добиться того же результата можно и без бесконечно рекурсии — если ее глубина будет достаточной (допустим, несколько миллионов). При этом необязательно большие объекты создавать.

и вообще, можно заюзать стэк функторов (std::stack<Something>) вместо реального вызова рекурсивных функций или методов
Posted via RSDN NNTP Server 1.9 beta
Re: Stack overflow
От: Аноним  
Дата: 29.06.04 07:25
Оценка:
А почему еще может переполнятся стек?
Re[2]: Stack overflow
От: Alex-AKF  
Дата: 29.06.04 08:29
Оценка:
29.06.04 в 11:25 в своём письме писал(а):

> А почему еще может переполнятся стек?


На какой итерации происход сие чудо?
Posted via RSDN NNTP Server 1.9 beta
Re: Stack overflow
От: Кодт Россия  
Дата: 29.06.04 09:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Объясните. пожалуйста, по каким еще причинам, кроме использования массива на 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 — это перерасход стека

К>...

Спасибо, именно это и хотел узнать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.