Wer löscht den während einer "neuen" Operation zugewiesenen Speicher, die eine Ausnahme im Konstruktor hat?

Ich kann wirklich nicht glauben, dass ich keine klare Antwort darauf finden konnte ...

Wie können Sie den zugewiesenen Speicher freigeben, nachdem ein C ++ - Klassenkonstruktor eine Ausnahme ausgelöst hat, wenn er mit dem Befehl initialisiert wurde?new Operator. Z.B.:

class Blah
{
public:
  Blah()
  {
    throw "oops";
  }
};

void main()
{
  Blah* b = NULL;
  try
  {
    b = new Blah();
  }
  catch (...)
  {
    // What now?
  }
}

Als ich das ausprobierte,b ist NULL im catch-Block (was Sinn macht).

Beim Debuggen ist mir aufgefallen, dass die Steuerung in die Speicherzuweisungsroutine eintritt, BEVOR sie den Konstruktor erreicht.

Dies auf der MSDN-Websitescheint dies zu bestätigen:

Wenn new zum Zuweisen von Speicher für ein C ++ - Klassenobjekt verwendet wird, wird der Konstruktor des Objekts aufgerufen, nachdem der Speicher zugewiesen wurde.

Denken Sie also daran, dass die lokale Variableb wird nie zugewiesen (d. h. ist NULL im catch-Block) Wie löscht man den zugewiesenen Speicher?

Es wäre auch schön, eine plattformübergreifende Antwort zu erhalten. Was sagt die C ++ - Spezifikation?

ERKLÄRUNG: Ich spreche nicht von dem Fall, in dem die Klasse selbst Speicher im c'tor reserviert und dann wirft. Ich weiß es zu schätzen, dass in diesen Fällen das d'tor nicht angerufen wird. Ich spreche von dem Speicher, der zum Zuweisen verwendet wirdDAS Objekt (Blah in meinem Fall).

Antworten auf die Frage(8)

Ihre Antwort auf die Frage