|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
|
О корректном завершении программ на с++01.11.2025, 19:49. Показов 6627. Ответов 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
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 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
|
|
|
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
|
||||||
| 04.11.2025, 11:13 | ||||||
|
Функция atexit() регистрирует функцию, которая будет выполнена при нормальном завершении работы программы.
Всего может быть зарегистрировано до 32 функций, которые будут выполнены при завершении работы в порядке обратном порядку регистрации.
1
|
||||||
|
1 / 1 / 0
Регистрация: 05.12.2024
Сообщений: 60
|
||||||||||||||
| 04.11.2025, 12:16 [ТС] | ||||||||||||||
|
К чему я это. Если определять длину выделяемой строки или слова стандартной функцией для с-строк, получится подобное:
Мне кажется проще определять длину слова (строки с минимальными изменениями фрагмента) с помощью:
Добавлено через 2 минуты
0
|
||||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 04.11.2025, 12:40 | ||
|
0
|
||
| 04.11.2025, 12:56 | |
|
Не по теме: ADnD, я бы на твоем месте воспользовался возможностью и попросил бы у DrOffset советов. Он и редко бывает на форуме, так что тебе повезло, не теряй свой шанс. Он один из немногих опытных программистов на форуме, хорошо разбирающийся в ООП.
0
|
|
|
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,034
|
|||||||||||
| 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
|
||||||||
|
6224 / 2925 / 1046
Регистрация: 01.06.2021
Сообщений: 10,824
|
||
| 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
|
|||
|
6224 / 2925 / 1046
Регистрация: 01.06.2021
Сообщений: 10,824
|
||
| 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
|
|
|
фрилансер
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,100
|
|
| 04.11.2025, 19:18 | |
|
sdf45, он медленный
0
|
|
|
Покинул чат.
1132 / 727 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
|
|
| 04.11.2025, 20:05 | |
|
0
|
|
|
6224 / 2925 / 1046
Регистрация: 01.06.2021
Сообщений: 10,824
|
||
| 04.11.2025, 22:00 | ||
|
0
|
||
| 04.11.2025, 22:00 | |
|
Помогаю со студенческими работами здесь
60
Корректное завершение работы консольного приложения Корректное освобождение памяти при принудительном завершении потока TThread Потоки и их корректное завершение Корректное завершение
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|