Kto usuwa pamięć przydzieloną podczas „nowej” operacji, która ma wyjątek w konstruktorze?
Naprawdę nie mogę uwierzyć, że nie mogłem znaleźć jasnej odpowiedzi na to pytanie ...
Jak uwolnić pamięć przydzieloną po tym, jak konstruktor klas C ++ zgłosi wyjątek, w przypadku, gdy jest on zainicjowany przy użyciunew
operator. Na przykład.:
class Blah
{
public:
Blah()
{
throw "oops";
}
};
void main()
{
Blah* b = NULL;
try
{
b = new Blah();
}
catch (...)
{
// What now?
}
}
Kiedy to wypróbowałem,b
jest NULL w bloku catch (co ma sens).
Podczas debugowania zauważyłem, że konrol wchodzi w procedurę przydzielania pamięci PRZED uderzeniem w konstruktor.
To na stronie internetowej MSDNwydaje się to potwierdzać:
Gdy nowy jest używany do przydzielania pamięci dla obiektu klasy C ++, konstruktor obiektu jest wywoływany po przydzieleniu pamięci.
Tak więc pamiętając o zmiennej lokalnejb
nigdy nie jest przypisany (tzn. jest NULL w bloku catch) Jak usunąć przydzieloną pamięć?
Byłoby również miło uzyskać odpowiedź na ten temat. tj. co mówi specyfikacja C ++?
WYJAŚNIENIE: Nie mówię o przypadku, w którym klasa przydzieliła sobie pamięć w c'tor, a następnie rzuca. Doceniam to, że w tych przypadkach d'tor nie zostanie wezwany. Mówię o pamięci używanej do przydzielaniaTHE obiekt (Blah
w moim przypadku).