|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|
О корректном завершении программ на с++01.11.2025, 19:49. Показов 6543. Ответов 77
Метки нет (Все метки)
Доброго времени суток,
Изучая книгу Страуструппа "Язык программирования С++. Специальное издание", обратил внимание на следующее утверждение "При вызове exit() не будут вызваны деструкторы локальных переменных во всех функциях вверх по цепочке имевших место функциональных вызовов. Генерация и перехват исключений гарантируют корректное уничтожение локальных объектов. Вызов же exit() не позволяет корректно отработать всем функциям из цепочки вызовов. Поэтому лучше не ломать контекст вызова функций и просто сгенерировать исключение, а вопрос о том, что делать дальше, оставить обработчикам" Допустим, в моей программе в месте, далеком по цепочке вызовов от main(), возникло событие, означающее что программа штатно закончило свою работу. Означает ли написанное выше что: 1) не стоит использовать библиотечные фукнции std::exit(), std::abort() 2) можно не заморачиваться с "правильным" завершением всех функций из цепочки вызовов, а достаточно сгенерировать исключение throw finish(), например. Разместить обработчик в main() и предусмотреть в нем вызов деструкторов глобальных объектов? Хотелось бы понять и запомнить как правильно поступать при необходимости завершения сложных программ, от которых зависят в т.ч. другие процессы. Понятно, что простые учебные программы можно завершать как угодно.
0
|
|
| 01.11.2025, 19:49 | |
|
Ответы с готовыми решениями:
77
Корректное закрытие программы при завершении работы Windows Корректное завершение работы сокетов Корректное завершение потока |
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 04.11.2025, 22:10 | |||
|
Который вероятно лишь обертка над уже готовыми функциями и их как оказалось уже достаточно. Больше того, обеспечен функционал порционного доступа к данным. К тому же, был бы смысл сравнивать если бы задача сводилась к нахождению одного паттерна. А если 10 раз делать match, то регулярка будет как минимум в 10 раз медленней.
0
|
|||
|
6181 / 2876 / 1042
Регистрация: 01.06.2021
Сообщений: 10,555
|
|
| 04.11.2025, 22:43 | |
|
0
|
|
| 05.11.2025, 03:30 | |||||||
|
Немного отрихтовал
Кликните здесь для просмотра всего текста
0
|
|||||||
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 05.11.2025, 05:56 | |
|
Royal_X, да, я парсер переделывал даже из-за этого.
Дело в не в парсерах, а в том, что регулярка - это общий случай. Пабысраму накидать прототип парсера или сделать что-то, не требующее спешки (единоразовый парс логов) - нормально. А если нужна ловля миллисекунд, то велкам в
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 05.11.2025, 12:45 | ||
|
Оптимизация если производится то позже. А иногда так вообще когда-то-потом или никогда. Возьмем для примера любой набор компиляторов для одного и того же ЯП. Преждевременная оптимизация - один из камней преткновения при разработке.
0
|
||
|
6181 / 2876 / 1042
Регистрация: 01.06.2021
Сообщений: 10,555
|
||
| 05.11.2025, 12:57 | ||
|
0
|
||
|
523 / 373 / 66
Регистрация: 09.03.2016
Сообщений: 3,960
|
||||||
| 05.11.2025, 13:32 | ||||||
|
Не пользовал я регулярку. Писал на if/else..
Мой гавнокод - быстрый гавнокод... А где сядешь, раньше выйдешь... Добавлено через 4 минуты
Кошка. На ней блохы...
0
|
||||||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|||||||
| 05.11.2025, 19:41 [ТС] | |||||||
|
Кликните здесь для просмотра всего текста
0
|
|||||||
| 05.11.2025, 22:03 | |||
|
Вот и весь "современный С++"
0
|
|||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|||||||
| 05.11.2025, 22:46 [ТС] | |||||||
|
Вот что получилось. Имхо симпатично: Кликните здесь для просмотра всего текста
0
|
|||||||
|
Покинул чат.
1132 / 727 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
|
|||||||||||||
| 05.11.2025, 23:20 | |||||||||||||
|
(другое дело если оно окажется внутри строкового литерала к примеру) Можно простой регуляркой находить позицию при построчном чтении
1
|
|||||||||||||
| 06.11.2025, 01:37 | |||||||||||||
Сообщение было отмечено ADnD как решение
Решение1. eol - не всегда один символ \n, хотя сейчас почти всегда так. В старых файлах eol может быть \r\n (да, 2 символа) или \r. Использование std::eol не решает проблему, в файлах данные старые 2. включать eol в извлекаемую строку (длину) не следует 3. для поиска одного символа лучше использовать strchr (вместо strstr) Главное Вынужден признать что логика разбора не то чтобы "безумно сложная", но гораздо более запутанная чем хотелось бы, все-таки придется вникать ![]() Добавлено через 1 час 58 минут
![]()
Кликните здесь для просмотра всего текста
1
|
|||||||||||||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|||||||||||||
| 06.11.2025, 11:00 [ТС] | |||||||||||||
|
Кликните здесь для просмотра всего текста
Мне понравилось, как быстро и просто я внес изменения в эту версию программы и она при этом "не сломалась". Для подсчета слов я напишу long long wordsCount(const char* ioSrc, const char* min), где ioSrc - указатель на начало просматриваемого фрагмента, min - указатель на позицию в которой был обнаружен конец строки или комментарий. Добавлю такие вызовы перед if (!min) в обоих функциях.Построчная обработка в текущей версии присутствует неявно. Указатели slc, mlc, elc можно назвать "точками отсечения", которые делят обрабатываемую строку на части. Количество комментариев определяется подсчетом таких частей. Это позволило уйти от повторных просмотров исходной строки и упростило программу. Проблем с учетом конца строки не наблюдал. В прошлой версии был звиздец с завершающими строками текста, которые заканчивались '\0' без предварительного символа '\n'. Из-за чего пришлось ломать голову и писать такой костыль: Кликните здесь для просмотра всего текста
В текущей версии такой проблемы не наблюдал. С Вашей помощью, я улучшил понимание как сделать более четкую структуру, возьму этот способ построения программы себе на вооружение на будущее. Огромное Вам спасибо! От души!!!
0
|
|||||||||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 06.11.2025, 15:14 | |||
|
И не пишут +100500 велосипедов изо дня в день. Скорость разработки, поддержания кода и т.д. куда важней тех самых блох. Добавлено через 59 секунд
0
|
|||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||
| 06.11.2025, 20:02 [ТС] | ||
|
В моем фрагменте нужно для того, чтобы изменение указателя отражалось и в вызывающей процедуре.
0
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 07.11.2025, 01:09 | ||
|
0
|
||
|
6181 / 2876 / 1042
Регистрация: 01.06.2021
Сообщений: 10,555
|
|
| 07.11.2025, 12:27 | |
|
Учитывая, что const char*& ioSrc вызвал такой интерес и что термины выше могут ввести в заблуждение новичков, которые в будущем зайдут в тему, то объясняю:
это ссылка на указатель на const char (т.е. на неизменяемые данные). Обратите внимание, что сам указатель не является константным, а таковыми являются только данные. Т.е. сам указатель можно менять, но вот символы не могут быть изменены через указатель. Ссылка же для того, чтобы изменения указателя сохранились снаружи. Такое часто применяется во всяких парсерах. Я не всегда объясняю правильными терминами, поэтому, если что, поправьте меня.
1
|
|
| 07.11.2025, 12:27 | |
|
Помогаю со студенческими работами здесь
78
Корректное завершение работы консольного приложения Корректное освобождение памяти при принудительном завершении потока TThread Потоки и их корректное завершение Корректное завершение
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|