leeren boost::shared_ptr zurück geben
-
Ja wie mach ich das?
Ich hab eine funktion welche shared_ptr in einen vector speichert und in einer anderen funktion geb ich halt die gespeicherten shared_ptr zurück, doch irgendwas muss ich ja auch zurück geben wenn der vector gerade mal leer ist. Wie kann ich also einen nicht referenzierten shared_ptr zurück geben, also einen der schlicht und einfach NULL ist.
Bisher mache ich das so.return boost::shared_ptr<CBasicClientCommand>();nur habe ich nun gelesen das man eigentlich keine anonymen ptr verwenden soll, zumindest nicht in funktionsaufrufen weil es zu problemen führen könnte. Aber ist das hier nicht auch im grunde ein anonymer shared ptr?
-
Was spricht dagegen? (ich würde zwar noch das explizite NULL in die Parameterliste schreiben, aber ansonsten ist das OK:
return shared_ptr<TYP>(NULL);)Problematisch werden anonyme Zeiger afaik nur, wenn du mit nackten Pointern arbeitest - weil sich niemand dafür zuständig fühlt, sie wieder freizugeben. Mit Smart-Pointern löst sich das Problem ganz von alleine

-
naja ich hab halt folgendes gelesen ich weiss nicht mehr genau woher aber ich quote mal hier rein
Avoid using unnamed shared_ptr temporaries to save typing; to see why this is dangerous, consider this example:
void f(shared_ptr<int>, int);
int g();void ok()
{
shared_ptr<int> p(new int(2));
f(p, g());
}void bad()
{
f(shared_ptr<int>(new int(2)), g());
}The function ok follows the guideline to the letter, whereas bad constructs the temporary shared_ptr in place, admitting the possibility of a memory leak. 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. See Herb Sutter's treatment (also here) of the issue for more information.
ok bei nochmaligen durchlesen versteh ichs nun naja bei NULL sollte es keine probleme geben. Hmm muss ich wohl weiter nach den eigentlichen problemen suchen.
-
Achso, so meinst du das. Wie dir vielleicht aufgefallen ist, geht es in diesem Text um die Übergabe als Parameter und nicht um die Ergebnisrückgabe.
(und ich bin mir nichtmal sicher, ob so eine bunt gemischte Abarbeitung der Argumente überhaupt erlaubt ist - entweder wird erst der shared_ptr angelegt oder erst g() aufgerufen, mitten in der Ausführung zu unterbrechen macht wenig Sinn)