|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|
О корректном завершении программ на с++01.11.2025, 19:49. Показов 7308. Ответов 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
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 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
|
|
|
639 / 397 / 68
Регистрация: 09.03.2016
Сообщений: 4,380
|
||||||
| 04.11.2025, 11:13 | ||||||
|
Функция atexit() регистрирует функцию, которая будет выполнена при нормальном завершении работы программы.
Всего может быть зарегистрировано до 32 функций, которые будут выполнены при завершении работы в порядке обратном порядку регистрации.
1
|
||||||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||||||||||||||
| 04.11.2025, 12:16 [ТС] | ||||||||||||||
|
К чему я это. Если определять длину выделяемой строки или слова стандартной функцией для с-строк, получится подобное:
Мне кажется проще определять длину слова (строки с минимальными изменениями фрагмента) с помощью:
Добавлено через 2 минуты
0
|
||||||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 04.11.2025, 12:40 | ||
|
0
|
||
| 04.11.2025, 12:56 | |
|
Не по теме: ADnD, я бы на твоем месте воспользовался возможностью и попросил бы у DrOffset советов. Он и редко бывает на форуме, так что тебе повезло, не теряй свой шанс. Он один из немногих опытных программистов на форуме, хорошо разбирающийся в ООП.
0
|
|
|
639 / 397 / 68
Регистрация: 09.03.2016
Сообщений: 4,380
|
|||||||||||
| 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
|
||||||||
|
Нарушитель
6699 / 3100 / 1064
Регистрация: 01.06.2021
Сообщений: 11,982
|
||
| 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
|
|||
|
Нарушитель
6699 / 3100 / 1064
Регистрация: 01.06.2021
Сообщений: 11,982
|
||
| 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
|
||||||||||||||||
|
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
|
|
| 04.11.2025, 18:57 | |
|
по-моему std::regex мог бы облегчить страдания
0
|
|
|
фрилансер
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
|
|
| 04.11.2025, 19:18 | |
|
sdf45, он медленный
0
|
|
|
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
|
|
| 04.11.2025, 20:05 | |
|
0
|
|
|
Нарушитель
6699 / 3100 / 1064
Регистрация: 01.06.2021
Сообщений: 11,982
|
||
| 04.11.2025, 22:00 | ||
|
0
|
||
| 04.11.2025, 22:00 | |
|
Корректное завершение работы консольного приложения Корректное освобождение памяти при принудительном завершении потока TThread Потоки и их корректное завершение Корректное завершение
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
|
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него.
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952
Инструкция внутри.
https:/ / youtu. be/ VpfFZSUDGnQ. . .
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|