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).

questionAnswers(8)

yourAnswerToTheQuestion