Подтвердить что ты не робот

Что такое переполнение стека?

Что такое ошибка? Какие типы программ/языков программирования могут возникнуть? Вероятно ли это в коде веб-приложения?

4b9b3361

Ответ 1

От Wikipedia:

В программном обеспечении происходит переполнение стека когда слишком много памяти используется на стек вызовов. Во многих программах языков, стек вызовов содержит ограниченный объем памяти, обычно определенных в начале Программа.

Стек - это структура данных, которая сохраняет запись точки, подпрограммы программы должны возвращать управление, когда они завершат выполнение. Адреса возврата помещаются в стек при вызове подпрограмм, когда подпрограмма завершает выполнение, адрес возврата вытаскивается из стека. Если есть много подпрограмм, и в стеке нет места, происходит переполнение стека.

Также в стеке хранятся локальные переменные, поэтому, если локальная переменная слишком велика, более вероятно, что стек не имеет места для ее хранения, если это так, происходит переполнение стека.

В Википедии есть хорошая диаграмма, изображающая стек, когда подпрограмма DrawLine вызывается из другой подпрограммы с именем DrawSquare, я надеюсь, что это изображение поможет лучше понять структуру стека.

stack diagram

Есть две основные причины: глубокие рекурсии функций и чрезмерно большие переменные стека. Поскольку это общие термины почти во всех языках программирования, переполнение стека может происходить помимо сложности языка.

Guffa вклад: стек не имеет ничего общего с сборкой мусора. Современные приложения имеют больший стек, что делает его несколько менее вероятным для, но кроме этого нет никакой разницы.

Ответ 2

Стек содержит несколько кадров стека и хранится в памяти. Каждый раз, когда вызывается функция, в стек добавляется новый стек стека. Фрейм стека содержит аргументы, которые должны быть переданы вызываемой функции, и адрес возврата, так что, когда вызываемая функция завершена, CPU знает, куда вернуться, чтобы он мог продолжить выполнение вызывающей функции. Фрейм стека может также содержать память, которая будет использоваться локальными переменными вызываемой функции.

В этом примере основная функция, называемая WriteCustomerDetails и вызывающая PrintToConsole, для записи отдельных бит данных, которые функция WriteCustomerDetails посмотрела вверх:

'======= top of stack =====================


Функция: PrintToConsole
Арг: Джон Смит, 34 Акация-авеню, Возраст 23
"------------------------------------------------- ---------- '
Функция: WriteCustomerDetails
Арг: Джон Смит
"------------------------------------------------- ---------- '
Функция: Главная страница '====== внизу стека ====================

Переполнение стека происходит, если недостаточно места для стека. Обычно стек находится в одном большом непрерывном блоке памяти, поэтому его не разделяют на куски, это означает, что для него требуется один большой кусок памяти, и это затрудняет выполнение сценария и расширение пространства, зарезервированного для стека если он заполняется.

Переполнение стека может часто возникать, когда функция случайно записывается, которая сама вызывает вызов. Иногда это нормально, когда функция вызывает себя, если в функции есть "if" или какое-то условие, которое останавливает вызовы в какой-то момент. Это называется рекурсивной функцией. Но если нет остановки, и функция продолжает называть себя, или, может быть, две или несколько функций продолжают звонить друг другу, то очень быстро они будут есть всю стек стек. Когда этого не осталось, вы получите переполнение стека, и программа выйдет из строя.

Возможно, это произойдет в любой программе, они не обязательно должны быть сложными, и это может произойти в коде, на котором запущен веб-сайт. И это может произойти и на языках сценариев.

Ответ 3

Переполнение стека происходит, когда вы используете слишком много пространства стека. Обычно бывает две ситуации:

Во-первых, когда вы ошибаетесь в коде, вызывая рекурсивный цикл без выхода. Например, свойство, считывающее из себя:

public int Length {
   get {
      return Length;
   }
}

Во-вторых, когда у вас слишком рекурсивный цикл. Поскольку пространство стека ограничено, вы можете только гнездовать алгоритм определенное количество раз. Если ваш алгоритм вложен слишком глубоко, поэтому перед его существованием заканчивается пространство стека, вы получаете переполнение стека. Пример:

public bool Odd(int value) {
   if (value == 0) {
      return false;
   } else {
      return !Odd(value - 1);
   }
}

Если вы вызовете этот метод со слишком большим значением, он будет слишком глубоким и приведет к переполнению стека.

Ответ 4

Из wikipedia, couse:

В программном обеспечении переполнение стека происходит, когда в стеке вызовов используется слишком много памяти. Во многих языках программирования стек вызовов содержит ограниченный объем памяти, обычно определяемый в начале программы. Размер стека вызовов зависит от многих факторов, включая язык программирования, архитектуру машины, многопоточность и объем доступной памяти. Когда в стеке вызовов используется слишком много памяти, стек считается переполненным; обычно приводя к сбою программы. 1 Этот класс программной ошибки обычно вызван одним из двух типов ошибок программирования

Ответ 5

Переполнение стека происходит, когда вы используете стек (duh...), и существует проблема выделения/чтения памяти. в "веб-программах", как вы выразились (я полагаю, вы говорите о HTML, PHP, JS), либо вы не используете стеки, либо используемый язык не допускает низкоуровневое управление памятью, которое предотвращает эти проблемы.

Ответ 6

Это память, которая допускает только толчок и поп. Вы не можете получить доступ к значениям между ними. Это следует за LIFO.