2010-03-21 14 views

Antwort

17

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.

+1

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

+2

@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. –

+0

@eriks: Sie werden kein Speicherleck bekommen, Sie werden nur hängende Zeiger bekommen. – kennytm