2016-02-25 4 views
12

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

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

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

+9

№ Это метод, известный как [RAII] (https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) полезен для. Если вам нужен класс для управления динамическим массивом, он называется ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). Не пытайтесь написать его самостоятельно. – BoBTFish

+2

Обязательное чтение: [Почему программисты на С ++ минимизируют использование «новых»?] (Http://stackoverflow.com/questions/6500313/why-should-c-programmers-minimize-use-of-new) –

+2

Помимо использования из 'std :: vector', если размер является фиксированной константой времени компиляции, а память не должна выделяться из кучи, рассмотрите использование [' std :: array'] (http: // en .cppreference.com/w/cpp/container/array). –

ответ

13

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

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

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

+4

технически, 'a' и' b' автоматически уничтожаются. Но уничтожение указателя ничего не делает. –

3

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

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

9

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

+0

Не будут уничтожены все три элемента данных? Их конструкторы закончили работу к моменту начала работы конструктора X. – templatetypedef

+0

(Обратите внимание, что деструкторы для элементов данных, если они являются необработанными указателями, не будут освобождать указатели.) – templatetypedef

+3

Технически правильно: лучший вид правильного. –

1

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

Смежные вопросы