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

Добрый день! Коллеги, не подскажите, плиз, насколько валиден код с прямым

вызовом деструктора в конструкторе, вот в таком духе:

struct Foo {

Foo() {
if (…) {this->~Foo(); }
}
};


Имею стойкое ощущение, что это UB по причине неначатого лайфтайма, но в Стандарте не нашел четкого пояснения по этому поводу (кроме пункта 18 в [class.dtor])
> Once a destructor is invoked for an object, the object’s lifetime ends; the behavior is undefined if the destructor
is invoked for an object whose lifetime has ended

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

20 ответов

22 просмотра

Не UB, но очень легко отстрелить себе ногу. Никогда так не делайте

Anton-Semenov Автор вопроса
🐈
Не UB, но очень легко отстрелить себе ногу. Никогд...

я и не хочу, пытаюсь обосновать коллегам почему так делать нельзя. Пока не нашел, но вдруг кто-то уже разбирался подробнее

Если так важно деинициализировать при неправильном вводе, то выбросьте ексепшн, чтобы ЯП сам вызвал деструктор

UB, 100%

Anton Semenov
я и не хочу, пытаюсь обосновать коллегам почему та...

1) явно вызывать деструктор нельзя , разве что объект создан через placement new 2) жизненный цикл объекта начинается с открывающейся { тела конструктора (если оно есть , конечно),

1) Можно, главное не забыть после вызова деструктора сделать placement new.

Anton-Semenov Автор вопроса
Ilya Zviagin
1) явно вызывать деструктор нельзя , разве что объ...

похоже что все не так просто, насчет аргумента 1 я как раз нашел опровержение, пример из [basic.life] : struct C { int i; void f(); const C& operator=( const C& ); }; const C& C::operator=( const C& other) { if ( this != &other ) { this->~C(); // lifetime of *this ends new (this) C(other); // new object of type C created f(); // well-defined } return *this; } C c1; C c2; c1 = c2; // well-defined c1.f(); //well-defined; c1 refers to a new object of type C

НЕ знаю, что там в стандарте на эту тему, но это дичь.

Вне зависимости от того, насколько это валидно, пожалуйста, не делай так

Anton-Semenov Автор вопроса
Антон 🇦🇲
Вне зависимости от того, насколько это валидно, по...

я задавал вопрос с надеждой, что местные душнилы укажут пункт в стандарте, вместо этого почему-то все только говорят, что это плохо 🙂

Sergey

Michael
Sergey

Я читал, да: скорее всего опубликую issue по этому поводу, оно родственно CWG2757, там скорее всего нормативная проблема (их немало в этих областях). @allcreater

Sergey Anisimov
Я читал, да: скорее всего опубликую issue по этому...

Нужно, чтобы это было плохо по стандарту просто)

Sergey Anisimov
Я читал, да: скорее всего опубликую issue по этому...

Ну там про деаллокацию вроде, а не вызов деструкторы

Michael
Нужно, чтобы это было плохо по стандарту просто)

Остальные родственные проблемы так и предложили решать. Здесь остается только напомнить, что есть еще один способ их создавать - этот =)

Anton-Semenov Автор вопроса
Sergey Anisimov
Я читал, да: скорее всего опубликую issue по этому...

Еще раз спасибо! ничего себе какие лютые бывают кейсы. Такого, чтоб вообще хоть кто-то пытался удалить this в конструкторе, еще не видел, но да, похоже что нормативная база не помешает и для такого 🙂

Anton Semenov
Еще раз спасибо! ничего себе какие лютые бывают ке...

Оказывается, в CWG2757 в самом примере буквально такой случай показан, просто в вординг забыли занести это, видимо. struct S { constexpr S() { this->~S(); } constexpr S(int) {} }; constexpr int f() { S s(0); s.~S(); std::construct_at(&s); // #1 return 0; } constexpr int x = f(); // error: undefined behavior at #1 during constant evaluation Спецификация очень страдает от отсутствия формальной верифицируемости. В сущности она консистентна ровно на столько, насколько ее удастся толпой вычитать. И работает это так себе, насколько я могу судить.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта