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

class A { A();

~A();

void reinitialize()
{
A::~A();
new(this) A;
}
};

Легально ли так делать? Я не вижу причин почему нет, но уверенности нет

17 ответов

27 просмотров

после вызова деструктора this остаётся валидным? кажется, что вряд ли.

кое кто делает, но в любом случае это выглядит как уб и ломает логику компилятору

Alexander B.-Babayants Автор вопроса
fr
после вызова деструктора this остаётся валидным? к...

а что с ним случится? ну даже если и так, то A * a = this; ~A(); new (a) A; точно валидно

Если я не ошибаюсь после этого нельзя пользоваться старыми указателями. Кажется это одно из применений launder.

magras
Если я не ошибаюсь после этого нельзя пользоваться...

launder для ситуаций когда разные типы в одной памяти в разное время. Ну и вроде уже не нужно его использовать никогда

Alexander B.-Babayants Автор вопроса
Sergey Anisimov
Есть свойство transparently-replaceable.

спасибо! у меня не op=, но пример оттуда очень похож на мой случай

Kelbon
launder для ситуаций когда разные типы в одной пам...

Из ссылки Sergey (спасибо, не знал про transparently-replacable): https://eel.is/c++draft/basic.life#note-4

Нельзя трогать this после вызова деструктора Не уверен даже, что можно так вызывать деструктор (там по-моему была какая то хрень про то что нельзя явно звать деструктор объекта у которого он автоматически вызывается) По-моему проще всего сделать так: Все внутренности A поместить в union { AImpl impl; }; impl.~AImpl(); new (&impl) AImpl{};

Alexander B.-Babayants Автор вопроса
Arelav
Нельзя трогать this после вызова деструктора Не ув...

тут уже привели ссылку на стандарт, где такой код в примере явно обозначен well-defined

А можно для общего развития, почему так нужно делать вместо реинициализации полей допустим?

Pepe 🐸
А можно для общего развития, почему так нужно дела...

А, хотя в деструкторе может какие то сайд эффекты

Alexander B.-Babayants Автор вопроса
Pepe 🐸
А можно для общего развития, почему так нужно дела...

в моем случае class A унаследован от другого класса из сторонней библиотеки, и у меня просто нет доступа к его полям

Pepe 🐸
А можно для общего развития, почему так нужно дела...

Видел, что таким методом реализуют copy и move операторы через соответствующие кторы.

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

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

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