2015-05-19 2 views
30

[class.dtor]/15 гласит, курсив мой:Что означает, что объект существует на C++?

После деструктор вызывается для объекта, объект больше не существует; поведение не определено, если деструктор вызывается для объекта, срок жизни которого закончился (3.8).

Однако, насколько я могу судить, это единственная ссылка в стандарте на объект «существующий». Это также, кажется, контрастирует с [basic.life], который является более конкретным:

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

  • , если T является типом класса с в нетривиальный деструктор (12.4), начинается вызов деструктора, или

  • Хранилище, которое объект занимает, используется повторно или освобождается.

У нас есть два различных формулировок здесь: «время жизни концов объекта» и «объект больше не существует», бывшие происходит только с нетривиальным деструктором и последние происходит с любыми деструктор. В чем смысл различия? Что означает, что объект больше не существует?

+1

C++ 03 имеет ту же формулировку. Заставляет меня задаться вопросом, нужно ли просто подхалиму, нуждающемуся в некоторой очистке. –

+0

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

+10

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active. html # 1285 –

ответ

1

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

Поэтому я считаю, что приведенная формулировка сломана и должна быть исправлена.

О том, что «время жизни» и «существование» означает, я предлагаю, что есть несколько различных контекстов, в которых они означают разные вещи:

В контексте строительства, жизни и существования начинаются, когда начинается конструктор. Вне этого контекста они начинаются, когда заканчивается конструктор.

В контексте разрушения, времени жизни и существования заканчивается конец деструктора. Вне этого контекста они заканчиваются, когда начинается разрушение.

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

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

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

+0

Справа. Ответ отредактирован. – Shavais

+0

Да, я не уверен, какая часть моей мозги покинула поле в стороне. Но, надеюсь, остальная часть ответа более или менее правильна. – Shavais

+0

Согласовано. Имейте upvote. –