Я действительно не могу поверить, что не мог найти ясного ответа на этот вопрос...
Как вы освобождаете память, выделенную после того, как конструктор класса С++ генерирует исключение, в случае, когда он инициализируется с помощью оператора new
. Например:.
class Blah
{
public:
Blah()
{
throw "oops";
}
};
void main()
{
Blah* b = NULL;
try
{
b = new Blah();
}
catch (...)
{
// What now?
}
}
Когда я это пробовал, b
имеет значение NULL в блоке catch (что имеет смысл).
При отладке я заметил, что conrol входит в процедуру распределения памяти перед тем, как он попадает в конструктор.
Это на веб-сайте MSDN похоже, подтверждает это:
Когда новый используется для выделения памяти для объекта класса С++, объект конструктор вызывается после памяти выделяется.
Итак, имея в виду, что локальная переменная b
никогда не назначается (т.е. NULL в блоке catch), как вы удаляете выделенную память?
Было бы неплохо получить кросс-платформенный ответ на это. то есть, что говорит спецификация С++?
CLARIFICATION: Я не говорю о том, что класс выделил память в c'tor, а затем выбрасывает. Я ценю, что в этих случаях д'ор не будет называться. Я говорю о памяти, используемой для выделения объекта (Blah
в моем случае).