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

class A { A();

~A();

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

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

17 ответов

14 просмотров

после вызова деструктора 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 операторы через соответствующие кторы.

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

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

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
всем вопрос. есть функция, которая иногда в линуксе валится с исключением EConvertError Invalid argument to date encode на строке Result:=LocalToUtcDateTime(FileDateToDateTime...
Handatros
9
И из-за этого сужается карман. Нет свободного полёта. Они либо могут какой-то заточенный прикладной софт, либо какой-то простой системный написать. По шаблону. А, допустим, по...
КТ315
9
Всем привет! Подскажите, как решить проблему или из-за чего это происходит. У меня есть проблема в WebStorm (v.2024.1.3): я ставлю любую тему, и через какое-то время меняется ...
Alexander Sheigov
12
А с каким компилятором не будет ошибкой использовать асм вставки?
Replicant ~
14
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
что насчет пагинга? на осдеве непонятно(
Vi Chapmann 🪙
26
Народ, кто шарит в расширенных разделах (EBR/EPR) на дисках с разметками MBR? Везде пишут (в вики рус/англ) в частности + другие источники смотрел, что первый сектор расширенн...
Eugene Krasnikov (ᴊɪɴ x)
1
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Карта сайта