Ich weiß, dass es nicht sicher ist, Ausnahmen von Destruktoren zu werfen, aber ist es jemals unsicher, Ausnahmen von Konstruktoren zu werfen?
Was geschieht z. B. bei Objekten, die global deklariert werden? Ein kurzer Test mit gcc und ich bekomme einen Abbruch, ist das immer garantiert? Welche Lösung würden Sie verwenden, um diese Situation zu bewältigen?
Gibt es Situationen, in denen Konstruktoren Ausnahmen auslösen können und die Dinge nicht so lassen, wie wir sie erwarten.
EDIT: Ich denke, ich sollte hinzufügen, dass ich versuche zu verstehen, unter welchen Umständen ich ein Ressourcenleck bekommen könnte. Sieht aus wie die vernünftige Sache zu tun ist, manuell freigeben Ressourcen, die wir erhalten haben, Teil Weg durch den Bau vor dem Auslösen der Ausnahme. Ich habe nie benötigt, um Ausnahmen in Konstruktoren vor heute zu werfen, so versuchen zu verstehen, wenn es irgendwelche Fallstricke gibt.
d.h. ist dies auch sicher?
class P{
public:
P() {
// do stuff...
if (error)
throw exception
}
}
dostuff(P *p){
// do something with P
}
...
try {
dostuff(new P())
} catch(exception) {
}
wird der dem Objekt P zugewiesene Speicher freigegeben?
EDIT2: Ich habe vergessen zu erwähnen, dass dostuff in diesem speziellen Fall den Verweis auf P in einer Ausgabewarteschlange speichert. P ist eigentlich eine Nachricht, und dostuff nimmt die Nachricht, leitet sie an die entsprechende Ausgabewarteschlange weiter und sendet sie. Im Grunde genommen wird die Nachricht, sobald sie in den Händen von dostuff ist, später in den Innereien von dostuff wieder freigegeben. Ich denke, ich möchte ein autoptr um P legen und release auf dem autoptr nach dostuff aufrufen, um ein Speicherleck zu verhindern, wäre das korrekt?