2009-06-24 4 views
2

Ist es ein Fehler, dies zu tun:werfen Ausnahmen von Objekten auf dem Stapel, Mem-Leck mit neuen?

if(some_error) 
    throw Cat("Minoo"); 

Wo Katze, die eine Klasse ist.

Dann in einer anderen Funktion, die die Methode aufgerufen, die die Ausnahme ausgelöst hat ...

Ich hätte:

catch(const Cat &c) 
{ 
} 

Wenn es ungültig ist, kann ich neue Katze verwenden („Minoo“) ;

Würde dies zu einem Speicherleck führen?

+6

Eigentlich ist das Werfen von Katzen mehr als ein Käfer - es ist geradezu gemein. :) –

+0

@Steve: Keine Sorge, haben Katzen nicht 7 Leben .. LOL – Xinus

Antwort

6

1) Ungültig? Nein, genau das solltest du tun: wirf ein Objekt. Das Objekt in der throw-Anweisung befindet sich möglicherweise auf dem Stapel, wird jedoch beim Auslösen kopiert. Vergleichen Sie zum Beispiel den Effekt der Ausführung von Return Cat ("Minoo");

2) Wird durch das Werfen eines Zeigers das spitze Objekt entweichen? Ja, wenn das Objekt auf dem Heap zugewiesen wurde und Sie es nicht löschen möchten. Aber Sie sollten generell vermeiden, Zeiger zu werfen.

+0

Danke für die Informationen über das Kopieren –

5

Was Sie geschrieben haben, ist absolut gültig und im Allgemeinen vorzuziehen, wenn Sie auf dem Heap Ausnahmenobjekte zuweisen.

Wenn Sie new verwenden, erhalten Sie natürlich einen Speicherverlust, es sei denn, Sie löschten das Objekt in einem Ausnahmebehandler, der die Ausnahme abgefangen hat.

This question in the C++ faq (und die beiden Fragen nach dem Wort) adressieren dies.

6

Was Sie jetzt haben, ist was jeder tun sollte, und die meisten tun. Wirf das Objekt selbst und fang nach const-reference.

Werfen Zeiger hat haarige Probleme wie "wer löscht es?".

Weitere Informationen here.

Verwandte Themen