Я действительно не могу поверить, что не смог найти четкого ответа на этот вопрос ...
Как освободить память, выделенную после того, как конструктор класса C ++ выдает исключение, если он инициализируется с помощью оператора new
. Например.:
class Blah
{
public:
Blah()
{
throw "oops";
}
};
void main()
{
Blah* b = NULL;
try
{
b = new Blah();
}
catch (...)
{
// What now?
}
}
Когда я это попробовал, b
в блоке catch было NULL (что имеет смысл).
При отладке я заметил, что элемент управления входит в процедуру выделения памяти ДО того, как он попадает в конструктор.
Это на веб-сайте MSDN , похоже, подтверждает это:
Когда new используется для выделения памяти для объекта класса C ++, конструктор объекта вызывается после выделения памяти.
Итак, имея в виду, что локальная переменная b
никогда не назначается (т.е. имеет значение NULL в блоке catch), как удалить выделенную память?
Также было бы неплохо получить по этому поводу кроссплатформенный ответ. то есть, что говорится в спецификации C ++?
УТОЧНЕНИЕ: я не говорю о случае, когда класс выделил память в c'tor, а затем выбрасывает. Я понимаю, что в таких случаях d'tor не будет вызван. Я говорю о памяти, используемой для выделения объекта THE (Blah
в моем случае).
b
останется нулевым. Я бы использовал для этого класс RAII, чтобы сбросить его до старого значения, если новое выражение выдает, если вы хотите на это положиться. - person Johannes Schaub - litb   schedule 05.11.2009