"delete" Frage
-
die begründung passt nicht auf dein beispiel.
wie pumuckl schon gesagt und hustbaer es wohl gemeint hat, ist es eine sache der angewöhnung. wenn du es bei deiner einparametrigen funktion so machst, wie hustbaer vorschlägt, wirst du es bei allen anderen funktionen auch eher so machen. konsistenz und gewöhnung, das ist alles.
-
Ahhh alles klar, ok ich hatte gedacht das bezog sich jetzt wirklich spezifisch auf mein Problem. Super dann danke an alle.
-
Since function arguments are evaluated in unspecified order, it is possible for new int(2) to be evaluated first, g() second, and we may never get to the shared_ptr constructor if g throws an exception
Verstehe ich nicht, die Argumente werden doch gleich komplett ausgewertet und nicht halb das erste, dann halb das zweite, dann die zweite Hälfte vom ersten?
Dann sehe ich hierbeif( shared_ptr<int>(new int(2)), g() );irgendwie kein Problem, da bei einer Exception vong()ja dershared_ptr, falls schon konstruiert, einfach destruiert wird. Ist hier evtl der Fall gemeint, dass dasnewnicht von einemshared_ptrummantelt ist? Alsof( new int(2), g() );, wobei dann implizit dershared_ptrkonstruiert wird?
-
Also so wie ich das verstanden habe, kann es MÖGLICH sein das Funktionsargumente in keiner bestimmten Reihenfolge abgearbeitet werden,und stell dir vor es wird zuerst das 2. Argument abgearbeitet, dort kracht es, dann geht er niemals in das shared_ptr Konstrukt rein.Meine vorstellung der Sache.
-
queer_boy schrieb:
die begründung passt nicht auf dein beispiel.
wie pumuckl schon gesagt und hustbaer es wohl gemeint hat, ist es eine sache der angewöhnung. wenn du es bei deiner einparametrigen funktion so machst, wie hustbaer vorschlägt, wirst du es bei allen anderen funktionen auch eher so machen. konsistenz und gewöhnung, das ist alles.
Genau das.
Dein Beispiel ist richtig, nur finde ich es besser die Variante vorzuschlagen die auch dann noch funktioniert wenn eine Funktion mehr als nur den shared_ptr als Parameter nimmt. (Deswegen hab ich ja auch "schlecht" und nicht "falsch" geschrieben
)Vielleicht wäre es besser gewesen wenn ich gleich erklärt hätte worum es geht

-
Firefighter schrieb:
Also so wie ich das verstanden habe, kann es MÖGLICH sein das Funktionsargumente in keiner bestimmten Reihenfolge abgearbeitet werden,und stell dir vor es wird zuerst das 2. Argument abgearbeitet, dort kracht es, dann geht er niemals in das shared_ptr Konstrukt rein.
Aber ich verstehe nicht, wo dann das Schlechte dabei ist.
void f(shared_ptr<int>, int); int g(); void bad() { f(shared_ptr<int>(new int(2)), g()); }Wenn hier
g()zuerst ausgeführt wird und eine Exception fliegt, ist doch alles in Ordnung. Wennshared_ptr<int>(new int(2))zuerst ausgeführt wird, danng()und ing()eine Exception geworfen wird, wird doch dershared_ptrdestruiert und kein Speicherleck oder ähnlich Schlimmes passiert. Fallsneweine Exception wirft, passiert auch nichts. Wo ist dann das Problem?
-
Das Problem ist, dass new und der Konstruktor von share_ptr nicht gleichzeitig passieren müssen. Sprich, wenn new aufgerufen wird und dann das andere Argument ausgewertet wird und eine exception los lässt, passiert der Konstruktor vom smart Pointer gar nicht und somit hast du ein Memory Leak.
-
Bist du dir sicher, dass das so passieren kann? Ich meine, klar, die Auswertungs-Reihenfolge von Argumenten ist unspezifiziert, aber können die wirklich teilweise und überlappend ausgewertet werden (halb das erste, dann das zweite, dann die zweite Hälfte vom ersten)?
-
Badestrand schrieb:
Bist du dir sicher, dass das so passieren kann? Ich meine, klar, die Auswertungs-Reihenfolge von Argumenten ist unspezifiziert, aber können die wirklich teilweise und überlappend ausgewertet werden (halb das erste, dann das zweite, dann die zweite Hälfte vom ersten)?
Ich kann da jetzt nicht mit meinem Namen einstehen, aber Meyers tut es. (Effektive C++ , Tipp 17).
Aber bei 5.2.2 / 8 kann man mal ansetzen.Ich geh jetzt essen.

-
Badestrand schrieb:
Bist du dir sicher, dass das so passieren kann? Ich meine, klar, die Auswertungs-Reihenfolge von Argumenten ist unspezifiziert, aber können die wirklich teilweise und überlappend ausgewertet werden (halb das erste, dann das zweite, dann die zweite Hälfte vom ersten)?
Die Boost-Leute sind sich sicher, und mir reicht das