Исключение выделения памяти в конструкторе
У меня есть конструктор, который выделяет несколько блоков памяти с помощью оператора 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 [].