ist die folgende Funktion OK:Kann ich auto_ptr durch Verweis auf Funktionen übergeben?
void DoSomething(auto_ptr< … >& a)....
ist die folgende Funktion OK:Kann ich auto_ptr durch Verweis auf Funktionen übergeben?
void DoSomething(auto_ptr< … >& a)....
Sie es tun können, aber ich bin mir nicht sicher, warum Sie es tun möchte. Wenn Sie auto_ptr verwenden, um den Besitz des ptr anzugeben (wie es im Allgemeinen der Fall ist), dann müssen Sie das auto_ptr nur an eine Funktion übergeben, wenn Sie den Besitz des ptr auf die Funktion übertragen wollen, in der Fall würden Sie die auto_ptr nach Wert übergeben:
void DoSomething(auto_ptr<int> a)
So Code jeder DoSomething Aufruf verzichtet Eigentum an den ptr:
auto_ptr<int> p (new int (7));
DoSomething (p);
// p is now empty.
Ansonsten einfach den ptr Wert übergeben:
void DoSomething(int* a)
{...}
...
auto_ptr<int> p (new int (7));
DoSomething (p.get());
// p still holds the ptr.
oder ein ref an den spitzen Pass zum Objekt:
void DoSomething(int& a)
{...}
...
auto_ptr<int> p (new int (7));
DoSomething (*p);
// p still holds the ptr.
Die zweiten in der Regel bevorzugt, da sie es noch deutlicher machen, dass DoSomething unwahrscheinlich ist, zu versuchen, das Objekt zu löschen.
Die Übergabe des Zeigers nach Wert ist nicht sicher - Speicherlecks könnten auftreten. Erstellen des Objekts ohne 'neu' bedeutet, dass das Objekt auf dem Stapel sein wird - nicht sicher, es ist auch der beste Ansatz. – amitlicht
@eriks: Speicherlecks * können * in vielen Situationen auftreten; Selbst wenn Sie ein 'auto_ptr' als Referenz übergeben, könnte jemand 'delete ptr.get()' aufrufen, was schlimmer wäre. Wertvolle Übergabe von Zeigern gibt keine Informationen über Eigentumsübertragung oder die korrekte Form der Löschung, so dass ich - ohne gegenteilige Dokumentation - nicht erwarten würde, dass der Angerufene das Objekt, auf das verwiesen wird, löscht. –
@eriks: Sie werden kein Speicherleck bekommen, Sie werden nur hängende Zeiger bekommen. – kennytm