Size: a a a

2020 July 05

P

Pepe 🐸 in pro.cxx
Serg
а в чем проблема?
arr_[k] = T(std::forward<Ts>(args)...);   вызовет operator=()  который при необъодимости очистит предыдущее состояние
источник

S

Serg in pro.cxx
в этом варианте конечно утечка
надо вставить arr_[k].~T(); перед new
источник

P

Pepe 🐸 in pro.cxx
Serg
в этом варианте конечно утечка
надо вставить arr_[k].~T(); перед new
спасибо
источник

VS

Vlad Serebrennikov in pro.cxx
Serg
о чем именно?  operator[] не перезаписывает
я почему-то подумал, что где-то в разделе containers стандарта написано, что деструктор не вызывается, но все оказалось проще
источник
2020 July 06

D

DarkPerl in pro.cxx
источник

IZ

Ilia Zviagin in pro.cxx
Pepe 🐸
Допустим есть какая то своя имплементация MyVector<T> и допустим есть T& operator[](size_t idx). Если T не trivially destructible, но RAII класс, что происходит с элементом в векторе если перезапишу что-то туда с помощью operator[]()? В стандарте написано что не гарантируется что деструтор T вызовется
Все это зависит исключительно от твоих классов T и MyVector
источник

IZ

Ilia Zviagin in pro.cxx
Pepe 🐸
даже если trivially destructible?
До placement new ты обязан руками, сам, вызвать деструктор для этого объекта.
Естественно, объект при этом обязан был быть сконструирован тоже через placement new.
источник

IZ

Ilia Zviagin in pro.cxx
Vlad Serebrennikov
я почему-то подумал, что где-то в разделе containers стандарта написано, что деструктор не вызывается, но все оказалось проще
Запомни: деструктор всегда вызывается.
источник

АВ

Александр Водянников... in pro.cxx
Вопрос по rapidjson здесь можно задать ?
источник

AS

Alex Sandrov in pro.cxx
Не всегда: если в конструкторе бросить исключение - объект не считается созданным, деструктор не вызывается при выходе из скопа 😐
источник

S

Serg in pro.cxx
Практически любое утверждение позволяет возразить "не всегда..."
источник

IZ

Ilia Zviagin in pro.cxx
Alex Sandrov
Не всегда: если в конструкторе бросить исключение - объект не считается созданным, деструктор не вызывается при выходе из скопа 😐
Неправда. Все уже сконструированные к этому моменту подобъекты будут удалены -- для них будет вызван деструктор.
источник

S

Serg in pro.cxx
а вот если exit() вызвать то дектрукторы объектов в стеке не вызовутся
источник

IZ

Ilia Zviagin in pro.cxx
Serg
а вот если exit() вызвать то дектрукторы объектов в стеке не вызовутся
А если ТerminateThread вызвать, то тоже не вызовутся...
А если компу питание вырубить, то тоже не вызовутся...
источник

AS

Alex Sandrov in pro.cxx
Ilia Zviagin
Неправда. Все уже сконструированные к этому моменту подобъекты будут удалены -- для них будет вызван деструктор.
Интересный момент. А разве их деструкторы не должны быть вызваны деструктором родительского объекта? 😑
источник

IZ

Ilia Zviagin in pro.cxx
Alex Sandrov
Интересный момент. А разве их деструкторы не должны быть вызваны деструктором родительского объекта? 😑
Ну так они и вызываются им.
источник

AS

Alex Sandrov in pro.cxx
Ну так он не будет вызван, если в конструкторе бросить исключение
источник

S

Serg in pro.cxx
часть его будет вызвана
источник

S

Serg in pro.cxx
которая неявная
источник

IZ

Ilia Zviagin in pro.cxx
Alex Sandrov
Интересный момент. А разве их деструкторы не должны быть вызваны деструктором родительского объекта? 😑
В момент неудачного конструирования объекта срабатывает его деструктор , и он удаляет все подобъекты, которые уже были сконструированы на данный момент
источник