У меня есть потенциально неустойчивый класс, который написал кто-то другой, и мне нужно создать массив объектов этого класса. Я упомянул, что класс нестабилен, поэтому он может иногда генерировать исключение в конструкторе по умолчанию. У меня нет доступа к исходному коду, только скомпилированные двоичные файлы.
Когда я распределяю динамический массив этих типов объектов с помощью new
, существует вероятность того, что один из этих плохих объектов может вызвать исключение. Это бросает пользовательское исключение, а не std::bad_alloc
. Во всяком случае, мне нужно, чтобы программа восстановилась из исключения и просто продолжала прерываться, хотя и устанавливала некоторые флаги ошибок, а что нет. Я думаю, что я должен delete
память, связанную с массивом, чтобы предотвратить утечку памяти.
Мое рассуждение состоит в том, что если класс генерирует исключение, строящее элемент где-то посередине массива, этот элемент не будет правильно построен, и все будущие элементы будут остановлены за исключением исключения, но предыдущие элементы будут правильно построенный, поскольку это произошло до того, как было выброшено исключение. Мне интересно, хорошая идея назвать delete
в catch (...) { }
? Как я могу решить проблему утечки памяти?
Badclass* array = nullptr;
try {
array = new Badclass[10]; // May throw exceptions!
} catch (...) {
delete[] array;
array = nullptr;
// set error flags
}
Так я визуализирую это в памяти. Это правильно?
array 0 1 2 3 4 5 6 7 8 9
___ __________________________________
| ---------->| :) | :) | :) | :) | :( | | | | | |
|___| |____|____|____|____|____|_|_|_|_|_|