Исключение выделения памяти в конструкторе

У меня есть конструктор, который выделяет несколько блоков памяти с помощью оператора new.

X::X() {
    a = new int[100];
    b = new char[100];
    c = new float[100];
}

Мой вопрос: если выделение c завершается с ошибкой, а конструктор генерирует исключение, будет ли автоматически освобождена память для a и b?

Ответ 1

Память, на которую a и b указывает, будет не автоматически освобождена. Каждый new[] должен быть явно сбалансирован с помощью delete[].

Даже если ваш деструктор выполнил удаление (при условии, что a, b и c являются членами класса), вы все равно будете утечки памяти. Это потому, что деструктор не будет вызываться в этом случае, так как объект не удалось создать.

Использование std::vector устраняет эти проблемы.

Ответ 2

a, b и c будут уничтожены. В зависимости от того, какие типы они есть, это может или не может освободить память. Если они указатели, их деструкторы ничего не делают, а память течет. Если они являются своего рода умным указателем, предположительно их деструкторы освободят память.

Ответ 3

Нет, они не будут. Вот почему вам нужно узнать о RAII и, в частности, контейнерах и интеллектуальных указателях.

В вашем случае вы можете использовать std::vector<T> вместо new T[100], например.

Ответ 4

Переменные a и b будут автоматически уничтожены не. В вашем случае вы должны использовать этот std::vector. Это происходит потому, что всякий раз, когда мы используем новый оператор [] для этого, нам нужно явно определить delete [].