Опять debug & release
Имеется такая проблема:
У меня приложение работает с сетью по TCP/IP протоколу.
Для этого при инициализации создаётся новый поток, назовём его "A", с помощью функции AfxBeginThread. Все параметры, такие как размер стека, приоритет, по умолчанию (0).
При успешном подключении по сети, из потока "A" создаётся ещё один поток "B", который в цикле принимает по сети от сервера информацию с помощью recv(), и обрабатывает её.
Далее у меня прорабатывается такая ситуация: сервер, к которому подключилось моё приложение, сначала посылает строку со своим титульным наименованием, затем посылает инфу об ошибке и разрывает соединение (так нужно по сценарию, прорабатываю ошибочную ситуацию).
Приложение в этом случае закрывает сокет, и полученное от сервера сообщение об ошибке выдаёт на экран, после чего завершает оба созданных потока "A" и "B".
Проблема в следующем:
В дебаге всё работает прекрасно,
в релизе - мало того что сразу после разрыва соединения, две локальные переменные int и CString, в которых записалась полученная от сервера инфа об ошибке, оказываются перетёртыми мусоросм, так ещё, в момент завершения потока "B" приложение слетает выдавая сразу две ошибки:
"The instruction "0x7c5737ec" referenced memory at "0xf120f3e0". The memory could not be "written".
"The instruction "0x7c5737ec" referenced memory at "0xeceeede0". The memory could not be "written".
Расставляя в разные точки функции потока MessageBox, выяснил, что программа вылетает именно в момент, когда в функции потока "B" встречается команда retun 0;
Однако, интересная происходит картина, когда я в эту же функцию вставляю код, который весь полученный от сервера трафик записывает в двоичный файл (для анализа происхождения ошибки), программа в релизе начинает работать правильно.
Если я вместо записи в файл просто вставляю задержку Sleep(500), не помогает - программа вылетает.
Помогите, что делать ?
на вопрос вряд ли отвечу, но всё-таки дай лучше кусок кода -- так хоть будет понятно о чём речь
Оказалось дело просто. Размер двух массивов char для хранения разной текстовой информации я сделал маловатым. Чуть-чуть не расчитал. При копировании в них строк длинее чем сам массив, в режиме релиз происходило перетирание других переменных и самого стека, чего не происходило в режиме дебаг.
Обратите внимание на параметр Default Char Unsigned подраздела Language раздела C/C++ окна свойств проекта
Цитата: michael_is_98
Обратите внимание на параметр Default Char Unsigned подраздела Language раздела C/C++ окна свойств проекта
А это к чему тут?
Если в release эта опция отключена и используется присваивание русских букв переменной типа char, то выдается подобное сообщение об ошибке.