New [], если конструктор по умолчанию элемента может выбрасывать?
рассмотрим следующий код:
example_t* a = new example_t[8];
class example_t
имеет значение по умолчанию ctor, которое может быть выбрано, предположим, что построение 5-го элемента в массиве выбрасывается. Есть ли автоматический вызов деструктора из четырех первых элементов? Это хорошо определенное поведение?
Ответы
Ответ 1
Это совершенно четко и хорошо. Все полностью построенные подобъекты уничтожаются, если инициализация объекта завершается с исключением, в обратном порядке их построения. Это то же самое для массивов, как и для объектов пользовательского типа (мыслить классы и члены класса).
Формально мы имеем С++ 11 15.2/2:
Объект любой продолжительности хранения, инициализация или уничтожение которого прекращается с помощью исключения, будет имеют деструкторы, выполняемые для всех своих полностью построенных подобъектов (исключая варианты членов класс объединения), т.е. для подобъектов, для которых главный конструктор (12.6.2) завершил выполнение и деструктор еще не начал выполнение.
Ответ 2
В § 5.3.4/8:
Новое выражение получает хранилище для объекта, вызывая функция распределения (3.7.4.1). Если новое выражение завершается бросая исключение, он может освободить хранилище, вызвав функция освобождения памяти (3.7.4.2). Если выделенный тип является не-массивом тип, имя функции распределения - это оператор new и имя функции освобождения - оператор delete. Если выделенный тип это тип массива, имя распределения назначается оператором new [] и имя функции освобождения - оператор delete [].
Они будут удалены, так как функция дезадаптации вызовет деструкторы.
Я знаю, что опираясь на вывод компилятора не заслуживает доверия, но это, по крайней мере, хорошее наблюдение: Live Test