Подтвердить что ты не робот

New [], если конструктор по умолчанию элемента может выбрасывать?

рассмотрим следующий код:

example_t* a = new example_t[8];

class example_t имеет значение по умолчанию ctor, которое может быть выбрано, предположим, что построение 5-го элемента в массиве выбрасывается. Есть ли автоматический вызов деструктора из четырех первых элементов? Это хорошо определенное поведение?

4b9b3361

Ответ 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