Вопрос по времени жизни объекта: N3242 Draft - PullRequest
0 голосов
/ 27 сентября 2011

Точка из C ++ 11 n3242 «Длительность подобъектов, время жизни объекта», 3.8 / 1:

Время жизни объекта - это свойство времени выполнения объекта. Считается, что объект имеет нетривиальную инициализацию, если он имеет класс или агрегатный тип, и он или один из его членов инициализируются конструктором, отличным от тривиального конструктора по умолчанию [Примечание: инициализация тривиальнымКонструктор копирования / перемещения является нетривиальной инициализацией.- примечание конца]

Время жизни объекта типа T начинается, когда:

  • хранилище с правильным выравниванием и размером для типа T и
  • если объект имеет нетривиальную инициализацию, его инициализация завершена.

Время жизни объекта типа T заканчивается, когда:

  • ifT - это тип класса с нетривиальным деструктором (12.4), запускается вызов деструктора или
  • хранилище, которое занимает объект, используется повторно или освобождается.

Здесь говорится о тривиальном или нетривиальном конструкторе копирования / перемещения с временем жизни объекта.Может ли кто-нибудь объяснить это с помощью некоторой программы-примера?

И изменение точки описывает, когда начинается время жизни объекта типа T, но они не упоминали, когда заканчивается T.Почему?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Здесь говорится о тривиальном или нетривиальном конструкторе копирования / перемещения с временем жизни объекта. Может кто-нибудь объяснить это с помощью примера программы?

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

Нелегко привести «пример» этого пункта; Я мог бы показать вам тривиальные и нетривиальные конструкторы, но на самом деле это ничего вам не скажет, поэтому я не собираюсь.

И изменение точки описывает, когда начинается время жизни объекта типа T, но они не упоминают, когда заканчивается T. Почему?

Да, они сделали. Теперь стало понятнее, когда я переформатировал цитату из вашего вопроса.

1 голос
/ 27 сентября 2011

В общем случае объект жив, когда его конструктор завершен, и доживает до начала работы деструктора.

Исключение составляют типы, которые настолько тривиальны, что, например, для них не запускается конструктор.после кода

int* p = (int*)malloc(1024);

у вас есть группа int, которые являются живыми, даже если они не были инициализированы каким-либо образом и никакие конструкторы не были выполнены.Тем не менее, они есть, и вы можете назначить им значения.

...