Каково различие между переполнением стека и переполнением буфера?

Взятый из книги ореховой скорлупы C# 3.0, Joseph Albahari

Поточная обработка в C# - Свободная Электронная книга

А ManualResetEvent является изменением на AutoResetEvent. Это отличается, в котором это автоматически не сбрасывает после того, как поток пропущен на вызове WaitOne, и так функции как логический элемент: вызов Набора открывает логический элемент, позволяя любое количество потоков что WaitOne в логическом элементе через; Сброс вызова закрывает логический элемент, порождение, потенциально, очередь официантов для накопления до его открытого следующего.

можно было моделировать эту функциональность с булевской переменной "gateOpen" поле (объявленный с энергозависимым ключевым словом) в сочетании со "сном вращения" †“неоднократно проверка флага и затем сон в течение короткого периода времени.

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

62
задан Nifle 9 February 2010 в 18:48
поделиться

7 ответов

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

Переполнение буфера относится к в любом случае, когда программа выполняет запись за пределами памяти, выделенной для любого буфера (в том числе в куче, а не только в стеке). Например,

130
ответ дан 24 November 2019 в 16:34
поделиться

Ключевое различие заключается в знании разницы между стек и буфер.

Стек - это пространство, зарезервированное для выполнения исполняемой программы. Когда вы вызываете функцию, ее параметры и возвращаемая информация помещаются в стек.

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

18
ответ дан 24 November 2019 в 16:34
поделиться

Больше, чем вы, вероятно, хотите знать здесь:

Переполнение стека

Переполнение буфера

11
ответ дан 24 November 2019 в 16:34
поделиться

Переполнение стека: вы поместили слишком много вещей в стек для памяти, выделенной текущему потоку

Переполнение буфера: Вы превысили размер вашего текущего выделенный буфер и не изменили его размер, чтобы он соответствовал (или не может изменить его размер).

11
ответ дан 24 November 2019 в 16:34
поделиться

Переполнение стека - это когда размер стека для потока превышает максимально допустимый размер стека для этого потока.

Переполнение буфера - это когда в память записывается значение, которое в данный момент не выделено программой.

5
ответ дан 24 November 2019 в 16:34
поделиться

Переполнение буфера обычно означает любое время, когда память Доступ к буферу осуществляется за его пределами, будь то стек или куча. Переполнение стека означает, что стек превысил выделенный лимит и на большинстве машин / ОС работает через кучу.

3
ответ дан 24 November 2019 в 16:34
поделиться

Разве вы не хотите сказать "в чем разница между стеком и буфером?" - это быстрее приведет вас к более глубокому пониманию. Как только вы зашли так далеко, вы можете подумать о том, что значит переполнить каждую из этих вещей.

3
ответ дан 24 November 2019 в 16:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: