|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|
О корректном завершении программ на с++01.11.2025, 19:49. Показов 6549. Ответов 77
Метки нет (Все метки)
Доброго времени суток,
Изучая книгу Страуструппа "Язык программирования С++. Специальное издание", обратил внимание на следующее утверждение "При вызове exit() не будут вызваны деструкторы локальных переменных во всех функциях вверх по цепочке имевших место функциональных вызовов. Генерация и перехват исключений гарантируют корректное уничтожение локальных объектов. Вызов же exit() не позволяет корректно отработать всем функциям из цепочки вызовов. Поэтому лучше не ломать контекст вызова функций и просто сгенерировать исключение, а вопрос о том, что делать дальше, оставить обработчикам" Допустим, в моей программе в месте, далеком по цепочке вызовов от main(), возникло событие, означающее что программа штатно закончило свою работу. Означает ли написанное выше что: 1) не стоит использовать библиотечные фукнции std::exit(), std::abort() 2) можно не заморачиваться с "правильным" завершением всех функций из цепочки вызовов, а достаточно сгенерировать исключение throw finish(), например. Разместить обработчик в main() и предусмотреть в нем вызов деструкторов глобальных объектов? Хотелось бы понять и запомнить как правильно поступать при необходимости завершения сложных программ, от которых зависят в т.ч. другие процессы. Понятно, что простые учебные программы можно завершать как угодно.
0
|
|
| 01.11.2025, 19:49 | |
|
Ответы с готовыми решениями:
77
Корректное закрытие программы при завершении работы Windows Корректное завершение работы сокетов Корректное завершение потока |
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|
| 03.11.2025, 21:43 [ТС] | |
|
DrOffset, я программирую в Visual Studio. Замеры через std::chrono::steady_clock с выводом результатов в консоль. Запускал и через F5 из VS, и собирал через Ctrl+B, затем копировал файлы на рабочий стол. Запускал с рабочего стола. Результаты одинаковые. Версия может и отладочная, файлы лежат в папке ..\x64\Debug. Но других вроде нет. Если что не так, подскажите как правильно.
0
|
|
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 03.11.2025, 23:19 | ||
|
Переключите сборку на Release. И там делайте замеры.
1
|
||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||
| 03.11.2025, 23:28 [ТС] | ||
|
Сделал замеры так: все версии примерно сравнялись +/- несколько миллисекунд. И char* c isspace(), и char* без оного, и string. Т.е. как и должно быть! Еще раз благодарю! ![]() З.Ы. посмотрю документацию MSVS по различиям между режимами. Так много информации, и так мало времени ((((
0
|
||
| 03.11.2025, 23:39 | ||||
|
Добавлено через 1 минуту
0
|
||||
| 03.11.2025, 23:54 | |
|
0
|
|
|
523 / 373 / 66
Регистрация: 09.03.2016
Сообщений: 3,961
|
||||||
| 04.11.2025, 11:13 | ||||||
|
Функция atexit() регистрирует функцию, которая будет выполнена при нормальном завершении работы программы.
Всего может быть зарегистрировано до 32 функций, которые будут выполнены при завершении работы в порядке обратном порядку регистрации.
1
|
||||||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||||||||||||||
| 04.11.2025, 12:16 [ТС] | ||||||||||||||
|
К чему я это. Если определять длину выделяемой строки или слова стандартной функцией для с-строк, получится подобное:
Мне кажется проще определять длину слова (строки с минимальными изменениями фрагмента) с помощью:
Добавлено через 2 минуты
0
|
||||||||||||||
|
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
|
||
| 04.11.2025, 12:40 | ||
|
0
|
||
| 04.11.2025, 12:56 | |
|
Не по теме: ADnD, я бы на твоем месте воспользовался возможностью и попросил бы у DrOffset советов. Он и редко бывает на форуме, так что тебе повезло, не теряй свой шанс. Он один из немногих опытных программистов на форуме, хорошо разбирающийся в ООП.
0
|
|
|
523 / 373 / 66
Регистрация: 09.03.2016
Сообщений: 3,961
|
|||||||||||
| 04.11.2025, 13:16 | |||||||||||
|
Royal_X,
Насчёт goto я конечно кривой и не правильный (мой кот гавно.) Но как то я начитался обрывков и goto не пользуюсь... Всегда можно обойти... А выходить из вложенных циклов, тогда надо башку включать... По аварии можно... А можно и без goto. Достаточно опрокинуть булеву переменную, на которой цикл вертиться. Или break... Или и то и другое.
0
|
|||||||||||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||||||||
| 04.11.2025, 14:50 [ТС] | ||||||||
|
Не по теме:
Я почувствовал, что многому могу научиться у DrOffset и Igor3D, поэтому пробую в своей программе все что они пишут и добросовестно выкладываю на форум результаты. Надеюсь не получить по башке за "флуд" и "раздувание темы" Добавлено через 20 минут ReadBuffer[buffersize], где const DWORD buffersize = 4095Далее сливал результаты в массив
Мой вопрос к Igor3D был связан с другим аспектом, а именно с использованием функций обработки с-строк, возвращающих указатель. Я сомневался в их целесообразности из-за необходимости подсчета длин каждой получающейся строки. Теперь, если я смогу ограничиться массивом ReadBuffer[4095], все упростится: я сделаю второй буфер такой же размерности для всех временных строк и третий - для слов. 12 кб памяти не будут сильно "жать карман".Спасибо!
0
|
||||||||
|
6183 / 2878 / 1042
Регистрация: 01.06.2021
Сообщений: 10,569
|
||
| 04.11.2025, 17:12 | ||
|
ADnD, не нравится мне твой сишный стиль. Пиши на современном С++.
1
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 04.11.2025, 17:34 | |||
|
Для этого нужно хорошее знание основ, то что раньше было в Си и не только(операторы new, передача аргументов, и много всего прочего). К этому нужно стремится. По поводу основного вопроса. Этими инструментами досрочного завершения приложения пользуются крайне редко. Потому что для большинства стандартных случаев достаточно обычного завершения цикла приложения. Даже с выбросом "исключения". Аварийное завершение приложение оправданно лишь в том случае, когда ничего нельзя поделать и штатное завершение неопределенно. Поэтому лучше просто упасть, чем завершится с логами или ещё чем, но удалить пользовательскую базу данных, к примеру, ведь мы не знаем как поведет себя приложение. Особенно учитывая что исключительная ситуация которую приложение не может обработать, например, в этом самом логгере. В общем случае, в С++ прикладным разработчикам достаточно системы исключений С++. И вызывать напрямую креш программы(через exit или тем более abort) нет необходимости. По всему остальному, тут мне нечего делать, с советчиками писать свои велосипеды на char*. Добавлено через 3 минуты Не по теме:
Можно втулить его куда угодно, но это лишь говорит о плохом стиле программирования и нежелания сделать лучше. Если же говорить про эффективность, да, это хорошо, лишь для низкоуровневого кода. Который довольно редко пишется на С++. И даже там, он сильно ломает читабельность и поддержку кода. Никто из готушников не может себя сдержать что бы не нагородить непроходимые огороды. А учитывая довольно специфичные ограничения goto в С++, то ещё и нехило так шанс накосячить.
0
|
|||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|||
| 04.11.2025, 17:51 [ТС] | |||
|
Не по теме:
Классы пока использовать не хочу, чтобы лучше освоить "базовые" средства, а после переходить к абстракциям Добавлено через 5 минут
0
|
|||
|
6183 / 2878 / 1042
Регистрация: 01.06.2021
Сообщений: 10,569
|
||
| 04.11.2025, 18:14 | ||
|
Алексей1153 тут намекнул про string_view, но никто не услышал. Понимаю, что у него там еще WinAPI, который со своей стороны постоянно искушает сишным стилем, но не нужно поддаваться этим искушениям. Кстати, с возвращением из бана.
0
|
||
| 04.11.2025, 18:46 | ||||||||||||||||
Если Вы услышали о неизвестной (Вам) ф-ции - сразу же открываете справочник (cppreference) и читаете/знакомитесь. Ф-ция strstr никаких аллокаций не требует. Возвращаемый указатель указывает на символ внутри исходной строки, где начинается искомая подстрока. Правда Вам нужна будет strnstr (с ограничением длины), что там с ней в MSVC - не помню, разберетесь. Кроме того, парсер который аллоцирует/копирует строки не может претендовать на какую-то скорость, и частенько может быть ускорен "в разы". Что приятно ускоряющему, но не автору оригинала Вызов malloc достаточно дорог по сравнению с пробегами по строке.Теперь со структурированием. Немного помогу, задача не такая уж простая. Главный цикл
А вообще "концептуально" (не побоюсь этого слова) вопрос интересный. Да, очень заметно что код структурирован плохо, везде налипают проверки. Если где-то заклинит (или изменятся требования) - разобраться нереально. Да и вообще лягнуть начинающего - святое дело Но .. что делать? Как "лучше структурировать"? Привлечь крутое std:: вместо древнего char * - по-моему это мало что изменит. Хотя версия с std::string_view интересна
1
|
||||||||||||||||
|
Покинул чат.
1132 / 727 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
|
|
| 04.11.2025, 18:57 | |
|
по-моему std::regex мог бы облегчить страдания
0
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,058
|
|
| 04.11.2025, 19:18 | |
|
sdf45, он медленный
0
|
|
|
Покинул чат.
1132 / 727 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
|
|
| 04.11.2025, 20:05 | |
|
0
|
|
|
6183 / 2878 / 1042
Регистрация: 01.06.2021
Сообщений: 10,569
|
||
| 04.11.2025, 22:00 | ||
|
0
|
||
| 04.11.2025, 22:00 | |
|
Помогаю со студенческими работами здесь
60
Корректное завершение работы консольного приложения Корректное освобождение памяти при принудительном завершении потока TThread Потоки и их корректное завершение Корректное завершение
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|