1 | |
Исключение типа "System.StackOverfliwException"10.03.2013, 16:55. Показов 3319. Ответов 21
Метки нет Все метки)
(
Добрый день.
В форма есть ТекстБокс и Кнопка. Ввожу текст в бокс, жму кнопку, функция обрабатывает содержимое и очищает бокс textBox2.Clear() таким способом. В результате на (примерно) 30м нажатии кнопки вылезает ошибка Исключение типа "System.StackOverfliwException" произошло в "System.Windows.Forms.dll". Подскажите, что не так с моим Боксом и как это исправить?
0
|
|
10.03.2013, 16:55 | |
Ответы с готовыми решениями:
21
Необработанное исключение типа "System.Net.Sockets.SocketException" в System.dll Необработанное исключение типа "System.ObjectDisposedException" в mscorlib.dll Потоки Thread: Необработанное исключение типа "System.NullReferenceException" Необработанное исключение типа "System.Reflection.TargetInvocationException" |
![]() 17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
|
|
10.03.2013, 17:01 | 2 |
Добрый день.
Гляньте двадцать восьмую строчку, ошибка скорее всего там.
1
|
10.03.2013, 17:08 [ТС] | 3 |
kolorotur, ТекстБокс раскрыть?
Добавлено через 3 минуты Раскрываю TextBox, а там во всех строчках значения: {Text = Невозможно вычислить выражение, поскольку текущий поток находится в состоянии переполнения стека.}
0
|
![]() 17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
|
|
10.03.2013, 17:20 | 4 |
Вообще это был тонкий намек на то, чтобы вы показали код обработчика кнопки и функции, выполняющей очистку текстбокса.
1
|
![]() 17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
|
|
10.03.2013, 17:51 | 6 |
Ну да, как же еще узнать, где ошибка возникает?
Телепатов здесь нет.
1
|
10.03.2013, 18:14 [ТС] | 7 |
А так на вскидку не можете предположить в чем причина.
Код не смогу скинуть, приложение большое, многие переменные вне функции расположены, да и используемые функции тоже придется прикладывать...
0
|
![]() 17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
|
|
10.03.2013, 18:35 | 8 |
Да причин, в общем-то, не много.
Первая, она же самая распространенная — это бесконечная рекурсия. Смотрите где у вас метод вызывает сам себя напрямую или через посредника (например, обработчик события TextChanged изменяет текст контрола, сгенерировавшего это событие). Вторая причина — попытка выделить в стеке памяти больше, чем имеется. Например, если у вас есть структура общим размером больше 2Мб, которую вы пытаетесь создать как локальную переменную в методе, или у вас количество локальных переменных переваливает за 2Мб. Что, как правило, свидетельствует либо о первой причине, либо о слишком большой вложенности методов (сли-ишком большой). Еще его можно схлопотать в небезопасном контексте при бездумном использовании stackalloc.
1
|
![]() 17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
|
|
10.03.2013, 18:40 | 10 |
Вполне, см. первую причину.
1
|
211 / 135 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
|
|
11.03.2013, 18:16 | 11 |
Размер стека потока всегда равен 2 метрам? Я почему-то думал, что CLR может назначать этот размер разный... Просто раньше экспериментировал с рекурсией, и обнаружил, что количество вложенных рекурсий до появления StackOverflowException на разных компах разное. То есть, на первом компе одна и та же функция может вызвать сама себя одно количество, а на другом компе количество будет совсем другое. И я тогда предположил, что CLR сама назначает размер стека по каким-то своим алгоритмам в зависимости от мощности железа...
0
|
![]() 17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
|
|
11.03.2013, 18:42 | 12 |
Нет, конечно.
Если мне не изменяет память, то на х86 размер стека по умолчанию равен 1Мб, на х64 — 2Мб. Более того, его размер можно менять вручную для каждого потока. Однако, судя по тому, что автор темы не может понять откуда берется ошибка переполнения стека, я предположил, что и размером стека он управлять не умеет, а значит работает со значениями по умолчанию. Отсюда и 2 метра ![]()
1
|
211 / 135 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
|
|
11.03.2013, 19:05 | 13 |
Ну да. В C++ его можно указать параметром в функции CreateThread() или _beginthreadex(), а в шарпе при создании и запуске нового потока его стек по дефолту в коде не указывается, а значит какие-то дефолтные значения размера есть
![]() Добавлено через 8 минут Когда я тестил, то в моем случае были две 32-разрядные системы XP и семерка. Плюс сильное различие в мощи железа. И размер стека был разным
0
|
![]() 17214 / 12668 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
|
|
11.03.2013, 19:09 | 14 |
0
|
211 / 135 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
|
|
11.03.2013, 19:13 | 15 |
Количеством вызовов метода самого себя до появления StackOverfliwException...
![]() Согласен, плохой метод, чтобы по нему утверждать о размере стека. Но тогда почему возможное количество вложенных вызовов разное? ![]()
0
|
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
|
|
11.03.2013, 19:16 | 16 |
0
|
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
|
|
11.03.2013, 20:37 | 18 |
Костяныч, это не рекурсия, это цикл. Рекурсия была-бы если бы внутри метода textbox.Clear вызывался бы метод textbox.Clear
0
|
NickoTin
|
11.03.2013, 21:42
Исключение типа "System.StackOverfliwException"
#20
|
Не по теме: Tolias28, по умолчанию размер резервируемого пространства для стека составляет 1 мб для x86 и 4 мб для x64 (характерно для .NET PE). Эти значения задаются линкером по умолчанию в PE заголовке при сборке: структура IMAGE_OPTIONAL_HEADER поле SizeOfStackReserve.
1
|
11.03.2013, 21:42 | |
Необработанное исключение типа "System.IO.IOException" произошло в mscorlib.dll Выдано исключение типа "System.OutOfMemoryException" Выдано исключение типа "System.OutOfMemoryException" Неявное преобразование типа "System.Drawing.Icon" в "System.Drawing.Image" невозможно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |