Windows Mobile C++(MFC) Удивительная вещь.
От: Аноним  
Дата: 18.12.08 20:54
Оценка:
Пишу простую программу, отправить запрос на сервер, принять ответ с сервера.
Для сокетов использую Эту библиотеку.
Все это делаю в блоке инилизации программы.
Создаю сокет, отсылаю запрос, все нормально.
дальше следующий код

char buf[1024]; char otvet[9999]; mysocket.set_buffer_size(sizeof(buf)); while (strstr(buf,"</html>")==0) { mysocket >> buf; strcat(otvet,buf); } mysocket.close();


компилируется, все хорошо, данные получаю правильные.
Но как только доходит до конца. (return TRUE прога вылетает с ошибкой обратся в микрософт
пишу:

mysocket.close(); delete []otvet; //ЧЕ ТУТ МОЖНО УДАЛИТЬ Я НЕ ЗНАЮ


и о чудо прога компилируется и работает, не каких ошибок
причем ей пофигу будули я удалять ответ или delete []buf;
она будет нормально работать.
Вот как можно объяснить такую сетуацию?
Проверял на WM6 в эмуляторе и на WM6.1 на своей коммуникаторе.
Re: Windows Mobile C++(MFC) Удивительная вещь.
От: Аноним  
Дата: 18.12.08 21:00
Оценка:
извините что в одну строку написал, скопировал и не посмотрел
Re: Windows Mobile C++(MFC) Удивительная вещь.
От: Alvares Украина  
Дата: 18.12.08 21:36
Оценка: :)
А>char otvet[9999];

...
А>delete []otvet; //ЧЕ ТУТ МОЖНО УДАЛИТЬ Я НЕ ЗНАЮ - Я ТОЖЕ НЕ ЗНАЮ!!!


Дружище, ты всегда удаляешь статические массивы с помощью delete?
Если да, то ты будешь получать и не такие ошибки.
don Alvares
Re[2]: Windows Mobile C++(MFC) Удивительная вещь.
От: Аноним  
Дата: 18.12.08 21:54
Оценка:
Здравствуйте, Alvares, Вы писали:

A>
А>>char otvet[9999];
A>

A>...
A>
А>>delete []otvet; //ЧЕ ТУТ МОЖНО УДАЛИТЬ Я НЕ ЗНАЮ - Я ТОЖЕ НЕ ЗНАЮ!!!
A>


A>Дружище, ты всегда удаляешь статические массивы с помощью delete?

A>Если да, то ты будешь получать и не такие ошибки.
В этом то и странность. Я знаю что этого со статическими массивами делать не надо. Просто решил проверить и чудо, но программа заработала.
Без этой строчки она выкидывает ошибку обратится в микрософт.
Я собственно это и спрашивал почему с delete работает, а без него- нет.
Re[3]: Windows Mobile C++(MFC) Удивительная вещь.
От: Alvares Украина  
Дата: 19.12.08 10:11
Оценка:
А>В этом то и странность. Я знаю что этого со статическими массивами делать не надо. Просто решил проверить и чудо, но программа заработала.
А>Без этой строчки она выкидывает ошибку обратится в микрософт.
А>Я собственно это и спрашивал почему с delete работает, а без него- нет.

Если статический массив объявляется внутри функции, то может возникнуть проблема с переполнением стека. рекоменую не выделять такие большие объемы памяти статически — использую динамическое выделение. Или поиграйся с настройками стека в IDE.
don Alvares
Re[3]: Windows Mobile C++(MFC) Удивительная вещь.
От: dcb-BanDos Россия  
Дата: 19.12.08 10:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alvares, Вы писали:


A>>
А>>>char otvet[9999];
A>>

A>>...
A>>
А>>>delete []otvet; //ЧЕ ТУТ МОЖНО УДАЛИТЬ Я НЕ ЗНАЮ - Я ТОЖЕ НЕ ЗНАЮ!!!
A>>


A>>Дружище, ты всегда удаляешь статические массивы с помощью delete?

A>>Если да, то ты будешь получать и не такие ошибки.
А>В этом то и странность. Я знаю что этого со статическими массивами делать не надо. Просто решил проверить и чудо, но программа заработала.
А>Без этой строчки она выкидывает ошибку обратится в микрософт.
А>Я собственно это и спрашивал почему с delete работает, а без него- нет.

это как вариант неопределенного поведения.
ты уверен что 1000 и 9999 чаров достаточно?!
в отладчике что происходит?!
на лицо переполнение статического буфера.
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re: Windows Mobile C++(MFC) Удивительная вещь.
От: cencio Украина http://ua-coder.blogspot.com
Дата: 23.12.08 22:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пишу простую программу, отправить запрос на сервер, принять ответ с сервера.

А>Для сокетов использую Эту библиотеку.
А>Все это делаю в блоке инилизации программы.
А>Создаю сокет, отсылаю запрос, все нормально.
А>дальше следующий код

А>
А>char buf[1024]; char otvet[9999]; mysocket.set_buffer_size(sizeof(buf)); while (strstr(buf,"</html>")==0) { mysocket >> buf; strcat(otvet,buf); } mysocket.close();
А>


А>компилируется, все хорошо, данные получаю правильные.

А>Но как только доходит до конца. (return TRUE прога вылетает с ошибкой обратся в микрософт

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

А>пишу:

А>
А>mysocket.close(); delete []otvet; //ЧЕ ТУТ МОЖНО УДАЛИТЬ Я НЕ ЗНАЮ
А>


А>и о чудо прога компилируется и работает, не каких ошибок

А>причем ей пофигу будули я удалять ответ или delete []buf;
А>она будет нормально работать.
А>Вот как можно объяснить такую сетуацию?

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