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

Если у объекта вызвать деструктор, но при этом placement new

не вызывался, то это же UB? Типа:
Type t;
t.~Type();

37 ответов

24 просмотра

Можно пример кода?

На момент автоматического разрушения t, да.

Если ~T() нетривиален, то в #1 неопределенность: { T t; t.~T(); } /* #1 */

d7d1cd- Автор вопроса
Sergey Anisimov
Если ~T() нетривиален, то в #1 неопределенность: {...

Таак. То есть, сам вызов деструктора - не UB?

d7d1cd
Таак. То есть, сам вызов деструктора - не UB?

В #1 неопределенность, если ~T() - не псевдодеструктор (не от встроенного типа). Скорее всего для встроенных это можно. { T t; t.~T(); t.~T() /* #1 */; }

d7d1cd- Автор вопроса
Sergey Anisimov
В #1 неопределенность, если ~T() - не псевдодестру...

А если после вызова сделать вот так: Type t; t.~Type(); auto f = t.f; ?

d7d1cd- Автор вопроса
d7d1cd
Таак. То есть, сам вызов деструктора - не UB?

Вызывать деструктор можно, если есть гарантия, что он не будет вызван повторно при разрушении объекта. Примеры: placement new и union.

d7d1cd
А если после вызова сделать вот так: Type t; t.~Ty...

При попытке использовать этот объект будет обращение к указателям, по которым уже сделан delete. Ничего хорошего из этого не получится

d7d1cd
Указателям?

Ну если есть деструктор - внутри объекта есть какой-то ресурс. Никто не запрещает вызвать деструктор, а потом метод, который к этим ресурсом обращается. В частности, если там были указатели, то по ним был сделан delete и обращение к ним не сулит ничего хорошего

d7d1cd- Автор вопроса
Константин
Ну если есть деструктор - внутри объекта есть како...

Указатель внутри может не владеть ресурсом, а только "смотреть" на него.

Константин
Ну если есть деструктор - внутри объекта есть како...

> Никто не запрещает вызвать деструктор, а потом метод, который к этим ресурсом обращается. Запрещает: вызов деструктора завершает время жизни объекта. Все его идентификаторы (имена переменных, ссылки, указатели) прекращают называть его и называют область хранилища, в которой он располагался при жизни. Вызов нестатического метода через такой идентификатор составляет неопределенную операцию безотносительно состава его тела.

d7d1cd
Указатель внутри может не владеть ресурсом, а толь...

А ещё это мог быть деструктор по умолчанию, который вообще ничего не освобождает. В общем случае мы не знаем, что из этого будет

Aleksander Spichak
С если речь об implicit lifetime type?

Не имеет значения. "Мертвыми" объектами "типонасыщенно" пользоваться нельзя.

Sergey Anisimov
> Никто не запрещает вызвать деструктор, а потом м...

Я имел ввиду, что можно это написать и не будет ошибки компиляции. Понятное дело, что так делать не надо

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

Ну тот же malloc с 20 стандарта даёт нам сторэйж. И с ним можно работать как с любым из impl lifetime type. В чем подвох?

Aleksander Spichak
Ну тот же malloc с 20 стандарта даёт нам сторэйж. ...

Так это же про разное: impl-lifetime-type на то и таков, что время жизни начинается, хоть и неявно. В обсуждении выше же речь о доступе вне этого времени.

Aleksander Spichak
Ну тот же malloc с 20 стандарта даёт нам сторэйж. ...

в том, что этот storage выдан специальной implicit lifetime функцией

Ivan Sokolov
компилятор имеет право отказать в компиляции, если...

Это Warning у gcc. Скажет, что используется неинециализированная переменная. Но если это предупреждение проигнорировать - обращение к полям после вызова деструктора происходит успешно

Aleksander Spichak
Разве?

Some operations are described as implicitly creating objects within a specified region of storage. http://eel.is/c++draft/intro.object#10.sentence-1

Константин
Это Warning у gcc. Скажет, что используется неинец...

С самой памятью деструктор ведь ничего не делает

Константин
С самой памятью деструктор ведь ничего не делает

The properties ascribed to objects and references throughout this document apply for a given object or reference only during its lifetime. http://eel.is/c++draft/basic.life#4.sentence-1

Константин
С самой памятью деструктор ведь ничего не делает

это справедливо лишь для trivially destructible типов

Там более строгая формальность есть через 1, 2.

Sergey Anisimov
Там более строгая формальность есть через 1, 2.

да, но я решил, что это не добавит ясности ответу, а кратко уже не будет

d7d1cd- Автор вопроса

Отсюда читай

интересно, если напрямую вызвать деструктор, то при уничтожении объекта на стеке будет ли деструктор еще раз вызван

http://eel.is/c++draft/basic.life#9

Vlad
http://eel.is/c++draft/basic.life#9

ну вообще логично да

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта