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 ответов

9 просмотров

Не 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 Спецификация очень страдает от отсутствия формальной верифицируемости. В сущности она консистентна ровно на столько, насколько ее удастся толпой вычитать. И работает это так себе, насколько я могу судить.

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

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

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
Добрый день! Хочу спросить совета. Хочется в скрипт добавить некую конструкцию, что скрипт создал файл, который нужно потом скопировать в определенное место. Нашел такой сп...
Mikhail
4
Вопрос по WIN32: Насколько я понимаю то все функции win32 привязаны к объектам операционной системы. Например консоль, файл, кисть, окна итд. Следовательно функции win32 упра...
Tommy Vercetti
6
in telegram can i have multiple username? so instead of having multiple account for example one for work, one for friend and one for family with three diff numbers. using one ...
Mr Thieves
6
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Hello, can I install macOS and run flutter on a virtual machine? Is it possible to print for iphone?
Mazones
11
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Карта сайта