Информация об изменениях

Сообщение Re[3]: placement new от 11.12.2022 21:38

Изменено 11.12.2022 21:41 rg45

Re[3]: placement new
Здравствуйте, maks1180, Вы писали:

R>>Согласно стандарту языка, использование одной и той же области памяти для размещения двух разных объектов порождает неопределенное поведение. Нельзя так делать.


M>Даже если первый объект больше не будет использован после создания второго ?


Ты знаешь, наверное, был не прав на счет неопределенного поведения (смайли от Сигмы заставил открыть стандарт). И оказалось, не все так однозначно, как мне казалось. В частности в стандарте прямо говорится, что программа может завершать время жизни без вызова деструктора и, само по себе это не влечет неопределенного поведения:

https://timsong-cpp.github.io/cppwp/basic.life#5

A program may end the lifetime of an object of class type without invoking the destructor, by reusing or releasing the storage as described above.


Но надо понимать, что деструктор объекта при этом не вызывается, а вот это уже может порождать неопределенное поведение. В этом же пунтке сказано вот что:

In this case, the destructor is not implicitly invoked and any program that depends on the side effects produced by the destructor has undefined behavior.


То есть, не UB в чистом виде, но программирование на грани фола, что называется. Без особой необходимости пускаться в такие авантюры лично я бы не стал.
Re[3]: placement new
Здравствуйте, maks1180, Вы писали:

R>>Согласно стандарту языка, использование одной и той же области памяти для размещения двух разных объектов порождает неопределенное поведение. Нельзя так делать.


M>Даже если первый объект больше не будет использован после создания второго ?


Ты знаешь, наверное, я был не совсем прав, все-таки, на счет неопределенного поведения (смайлик от Сигмы заставил открыть стандарт). И оказалось, не все так однозначно, как мне казалось. В частности, в стандарте прямо говорится, что программа может завершать время жизни без вызова деструктора и, само по себе это не влечет неопределенного поведения:

https://timsong-cpp.github.io/cppwp/basic.life#5

A program may end the lifetime of an object of class type without invoking the destructor, by reusing or releasing the storage as described above.


Но надо понимать, что деструктор объекта при этом не вызывается, а вот это уже может порождать неопределенное поведение. В этом же пунтке сказано вот что:

In this case, the destructor is not implicitly invoked and any program that depends on the side effects produced by the destructor has undefined behavior.


То есть, не UB в чистом виде, но программирование на грани фола, что называется. Без особой необходимости пускаться в такие авантюры лично я бы не стал.