Вслед за этим: Вызывается деструктор при вызове конструктора делегирования?
class X
{
public:
X() {};
X(int) : X() { throw std::exception(); }
X(double) { throw std::exception(); }
~X();
};
Как насчет динамической памяти? Обычно исключение в конструкторе означает, что объект не был полностью сконструирован и, следовательно, память очищена и не потеряна.
Но аргумент в предыдущем вопросе состоит в том, что объект полностью сконструирован (или полностью инициализирован) после завершения делегирования. Как это влияет на восстановление памяти? Я надеюсь, что память все еще очищена!
int main()
{
new X(5); // new called
// delete called because delegate completed.
// I assume:
// Memory re-claimed (because constructor did not complete)
// I assume the C++11 standard adjusted to compensate.
// As a constructor did complete.
}
Сравнено также:
int main()
{
new X(5.0); // new called
// Delete **NOT** called
// Memory re-claimed (because constructor did not complete)
}
Если память очищена, тогда определение того, когда происходит очистка памяти, необходимо изменить с помощью спецификации С++ 03. Как изменилось поведение?