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

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

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

37 ответов

27 просмотров

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

На момент автоматического разрушения 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

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

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

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

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