Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выход из программы, очистка памяти

40K
01 декабря 2008 года
ltorriel
11 / / 01.12.2008
Имеется программа с потоком, боксами, множеством переменных.
При компилировании в режиме Дебаг - всё отлично, работает, выходит без проблем, при компилировании в режиме Релиз - выходит с ошибкой windows'совской.
Показал знакомому программисту - сказал память не очищаешь.
Действительно, не очищаю. Выхожу через ExitProcess(0);

Вопрос: как очистить память?
обнулять каждую переменную которую объявил? или как?

ни в одном языке(borland delphi, VB) такого не видел.

Заранее благодарен.
11
01 декабря 2008 года
oxotnik333
2.9K / / 03.08.2007
скорей всего память очищается, но не правильно, если ее не очищать то ошибок не будет, а будет просто утечка.
ЗЫ: Вопрос скорей в спец тему.
355
01 декабря 2008 года
<SCORP>
786 / / 21.10.2006
что за приложение? WinAPI\MFC\etc?
40K
02 декабря 2008 года
ltorriel
11 / / 01.12.2008
MFC-приложение
3.7K
03 декабря 2008 года
_lobster_
115 / / 10.04.2005
Попробуй вместо ExitProcess(0) посылать своему окну WM_CLOSE, например, так AfxGetMainWnd()->PostMessage(WM_CLOSE);. Немного извращенно, но меня не раз спасало!
288
03 декабря 2008 года
nikitozz
1.2K / / 09.03.2007
Неплохо было бы посмотреть на скриншот с ошибкой.
Вообще странно. При вызове ExitProcess(0); программа полностью завершается даже не пытаясь ничего очистить. Но вот Windows должна венуть в систему все ресурсы, использованные процессом. Сообщение же об ошибке выдает BaseProcessStart в процессе при необработаном исключении.
40K
03 декабря 2008 года
ltorriel
11 / / 01.12.2008
Скриншот ошибок (см. вложение)
40K
03 декабря 2008 года
ltorriel
11 / / 01.12.2008
При замене ExitProcess(0); на AfxGetMainWnd()->PostMessage(WM_CLOSE); приложение успешно .. зависло, причем намертво.
Помог только CTRL+ALT+DEL, не было отклика даже на выбор в панели задач.
355
03 декабря 2008 года
<SCORP>
786 / / 21.10.2006
помоему можно просто theApp.getMainFrame()->Close()
3.7K
03 декабря 2008 года
_lobster_
115 / / 10.04.2005
Цитата: ltorriel
При замене ExitProcess(0); на AfxGetMainWnd()->PostMessage(WM_CLOSE); приложение успешно .. зависло, причем намертво.
Помог только CTRL+ALT+DEL, не было отклика даже на выбор в панели задач.



Скорее всего из-за потоков

40K
04 декабря 2008 года
ltorriel
11 / / 01.12.2008
Поток один, я его закрываю перед выходом.
Кстати, сейчас посмотрю закрываю ли я в потоке СОМ порт..
288
04 декабря 2008 года
nikitozz
1.2K / / 09.03.2007
Вообще лучше всего завершать приложение корректно. Т.е. когда заканчивает свою работу основной поток.
40K
04 декабря 2008 года
ltorriel
11 / / 01.12.2008
Поясню.
Если жмут кнопочку "Выход" на форме, то в файле добавочного потока(там бесконечный цикл с case'ами, break'ами естественно тоже, но не везде) я его посылаю на кейс закрытия, там:
CloseHandle(hCOM); - закрываю открытый в этом же потоке com-порт
ExitThread(0); - завершаю поток
Затем на нажатии клавиши после этого закрываю хэндл потока
CloseHandle(hThread);
и делаю ExitProcess(0);

Получаю каждый раз в релизе ошибки 2 штуки и "Отправить отчет?" 3 штуки.
40K
04 декабря 2008 года
ltorriel
11 / / 01.12.2008
Корректно - как?
288
04 декабря 2008 года
nikitozz
1.2K / / 09.03.2007
Лично я бы на вашем месте не выходил бы из вторичного потока с помощью ExitThread, а просто бы позволил его функции завершиться. И из основного потока выходить с помощью ExitProcess(0); не стоит. Если на кнопке написано "выход", значит просто закройте главное окно с ее помощью.
Хотя без кода перед глазами сказать что-либо довольно сложно. Вполне возможно, что проблема совсем не в ExitProcess(0), а где-то "выше".
40K
04 декабря 2008 года
ltorriel
11 / / 01.12.2008
Хотелось бы поподробнее - как "просто закрыть" окно с программой?
А по поводу дать функции завершиться - не понял что имеете ввиду.
У меня поток с бесконечным циклом, он разложен на состояния кейсом(работает, пауза, выход). Когда жму кнопку, передаю через глобальную переменную ему значение для перехода на кейс выхода. Там поток "завершает сам себя" и затем я пытаюсь завершить процесс программы.
Например в VB это делает End, у меня, к сожалению, не получается корректно закрыть приложение.
40K
04 декабря 2008 года
ltorriel
11 / / 01.12.2008
После ещё одного долгого разбора ответов яндекса и гугла, не найдя ничего подходящего, решил включить голову и заменил exitprocess(0) на банально exit(0)
Всё работает, всем спасибо!
288
05 декабря 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: ltorriel
Хотелось бы поподробнее - как "просто закрыть" окно с программой?


У вас ведь оконное приложение? Тогда просто пошлите главному окну сообщение WM_CLOSE любым способом.

Цитата: ltorriel

А по поводу дать функции завершиться - не понял что имеете ввиду.



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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог