течение всей работы программы выполняет одни и те же действия. правильно ли я сделаю, если перед завершением работы программы просто вызову .detach() к нему и после завершения основного потока он сам "умрет". Не будет ли это неопределенным поведением?
Это точно не нормальное решение, но ссылку на стандарт не дам. В 20ом стандарте добавили jthread. Помимо того, что он join'ит тред в деструкторе, он может передать в функцию stop_token который можно использовать чтобы корректно завершить функцию. До 20го стандарта не сложно реализовать подобный механизм самому. Можно даже сделать его совместимым по интерфейсу со stop_token.
Вообще не стоит так делать. К примеру, если это какой-нибудь логгер, то он может умереть во время сохранения очередной записи и она получится кусочная.
http://eel.is/c++draft/basic.exec#basic.start.main-4 да, для того, что лежит на стеке, деструкторы вызваны не будут, и никакого неопределенного поведения в этом действии нет, насколько я понимаю
Невызов деструктора при вызванном конструкторе может не быть UB? И я что-то не уверен, что там даже завершение вызова конструкторов гарантируется в таком случае.
Утечка памяти не UB, считай объекты со стека утекли)
Так мало ли что там в деструкторе делается, а если это RAII-wrapper над чем-то внешним стейтовым?
Это частный случай, такие вещи не юзай
это все-таки нарушение контракта внешнего объекта, а не UB
если вкратце, то время жизни объекта можно закончить, освободив или переиспользовав storage, но только если деструктор тривиальный, иначе UB http://eel.is/c++draft/basic.life#1 http://eel.is/c++draft/basic.life#5 http://eel.is/c++draft/basic.life#6.1
Есть std::exit, есть std::terminate. Ни тот ни другой не будут разрушать объекты на стеке.
Обсуждают сегодня