170 похожих чатов

Подскажите. у меня есть thread, который в цикле while(true) в

течение всей работы программы выполняет одни и те же действия. правильно ли я сделаю, если перед завершением работы программы просто вызову .detach() к нему и после завершения основного потока он сам "умрет". Не будет ли это неопределенным поведением?

10 ответов

11 просмотров

Это точно не нормальное решение, но ссылку на стандарт не дам. В 20ом стандарте добавили jthread. Помимо того, что он join'ит тред в деструкторе, он может передать в функцию stop_token который можно использовать чтобы корректно завершить функцию. До 20го стандарта не сложно реализовать подобный механизм самому. Можно даже сделать его совместимым по интерфейсу со stop_token.

Вообще не стоит так делать. К примеру, если это какой-нибудь логгер, то он может умереть во время сохранения очередной записи и она получится кусочная.

http://eel.is/c++draft/basic.exec#basic.start.main-4 да, для того, что лежит на стеке, деструкторы вызваны не будут, и никакого неопределенного поведения в этом действии нет, насколько я понимаю

Vlad
http://eel.is/c++draft/basic.exec#basic.start.main...

Невызов деструктора при вызванном конструкторе может не быть UB? И я что-то не уверен, что там даже завершение вызова конструкторов гарантируется в таком случае.

Andrew
Невызов деструктора при вызванном конструкторе мож...

Утечка памяти не UB, считай объекты со стека утекли)

Kirill Bolshakov
Утечка памяти не UB, считай объекты со стека утекл...

Так мало ли что там в деструкторе делается, а если это RAII-wrapper над чем-то внешним стейтовым?

Andrew
Так мало ли что там в деструкторе делается, а если...

это все-таки нарушение контракта внешнего объекта, а не UB

Andrew
Невызов деструктора при вызванном конструкторе мож...

если вкратце, то время жизни объекта можно закончить, освободив или переиспользовав 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

Andrew
Невызов деструктора при вызванном конструкторе мож...

Есть std::exit, есть std::terminate. Ни тот ни другой не будут разрушать объекты на стеке.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта