Поведение не определено, потому что деструктор вызывается дважды для одного и того же объекта:
- Один раз, когда вы вызываете его явно
- Один раз, когда заканчивается область действия и автоматическая переменная уничтожается
Вызов деструктора для объекта, время жизни которого закончилось, приводит к неопределенному поведению в C ++ 03 §12.4 / 6:
поведение не определено, если деструктор вызывается для объекта, время жизни которого закончилось
Время жизни объекта заканчивается, когда его деструктор вызывается в соответствии с §3.8 / 1:
Время жизни объекта типа T
заканчивается, когда:
- если T
является типом класса с нетривиальным деструктором (12.4), начинается вызов деструктора, или
- хранилище, которое занимает объект, используется повторно или освобождается.
Обратите внимание, что это означает, что если в вашем классе есть тривиальный деструктор, поведение четко определено, поскольку время жизни объекта такого типа не заканчивается до тех пор, пока не будет освобождено его хранилище, что для автоматических переменных не происходит до конца функции. Конечно, я не знаю, почему вы явно вызываете деструктор, если он тривиален.
Что такое тривиальный деструктор? §12.4 / 3 говорит:
Деструктор тривиален, если он неявно объявлен деструктором и если:
- все прямые базовые классы этого класса имеют тривиальные деструкторы и
- для всех нестатических членов данных своего класса, которые имеют тип класса (или его массив), каждый такой класс имеет тривиальный деструктор.
Как уже упоминалось, одним из возможных результатов неопределенного поведения является то, что ваша программа продолжает работать правильно; Другим возможным результатом является сбой вашей программы. Все может произойти, и нет никаких гарантий.