Время жизни объекта закончилось до вызова деструктора? - PullRequest
11 голосов
/ 23 декабря 2011

Я не понимаю этого:

3.8 / 1 "Время жизни объекта типа T заканчивается, когда: - если T является типом класса с нетривиальным деструктором (12.4), вызов деструктора начинается , или - память, занимаемая объектом, используется повторно или освобождается. "

Если время жизни заканчивается до запуска деструктора, нечто означает, что доступ к членам в деструкторе - это неопределенное поведение?

Я тоже видел эту цитату:

12.7 "Для объекта с нетривиальным деструктором, относящимся к любомунестатический член или базовый класс объекта после того, как деструктор завершает выполнение, приводит к неопределенному поведению. "

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

Ответы [ 4 ]

8 голосов
/ 23 декабря 2011

«Время жизни» объекта относится к потребителям объекта, а не самого объекта. Поэтому класс потребления не должен пытаться получить доступ к членам объекта после начала уничтожения.

8 голосов
/ 23 декабря 2011

Если время жизни заканчивается до запуска деструктора, разве это не означает, что доступ к членам в деструкторе является неопределенным поведением?

Надеюсь, нет:

От N3242 Построение и уничтожение [class.cdtor] / 3

Чтобы сформировать указатель (или получить доступ к значению) прямого нестатического члена объекта obj, конструкцияobj должен начаться и его уничтожение не должно завершиться , в противном случае вычисление значения указателя (или доступ к значению элемента) приводит к неопределенному поведению.

5 голосов
/ 23 декабря 2011

Нет, проблем нет:

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

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

1 голос
/ 12 января 2017

«Время жизни» не значит это.Это точно определенный термин в стандарте, который имеет множество последствий, но он может не иметь всех последствий, о которых вы могли бы подумать.Члены по-прежнему могут использоваться во время конструирования и уничтожения, внешний код может вызывать функции-члены и т. Д. И т. Д.

Конечно, для клиентского кода немного странно вызывать функции-члены одновременно с деструктором, но не случайно.конечно не запрещено языком.В частности, std::condition_variable явно позволяет вызывать деструктор, пока имеются ожидающие вызовы condition_variable::wait().Он запрещает новые вызовы wait() после запуска деструктора.

...