è la seguente funzione OK:Posso passare auto_ptr per riferimento alle funzioni?
void DoSomething(auto_ptr< … >& a)....
è la seguente funzione OK:Posso passare auto_ptr per riferimento alle funzioni?
void DoSomething(auto_ptr< … >& a)....
Si può fare, ma non sono sicuro perché si vuole farlo.
Se si utilizza l'auto_ptr per indicare la proprietà del ptr (come in genere fanno le persone), è sufficiente passare l'auto_ptr a una funzione se si desidera trasferire la proprietà del ptr alla funzione, in cui caso si potrebbe passare l'auto_ptr per valore:
void DoSomething(auto_ptr<int> a)
Quindi, qualsiasi codice chiamante DoSomething cede la proprietà delle PTR:
auto_ptr<int> p (new int (7));
DoSomething (p);
// p is now empty.
Altrimenti basta passare il PTR per valore:
void DoSomething(int* a)
{...}
...
auto_ptr<int> p (new int (7));
DoSomething (p.get());
// p still holds the ptr.
o passare un ref al appuntito per oggetto:
void DoSomething(int& a)
{...}
...
auto_ptr<int> p (new int (7));
DoSomething (*p);
// p still holds the ptr.
Il secondo è generalmente preferibile in quanto rende più esplicito che DoSomething è improbabile che tentare di eliminare l'oggetto.
il passaggio del puntatore per valore non è sicuro - potrebbero verificarsi perdite di memoria. creare l'oggetto senza "nuovo" significa che l'oggetto sarà in pila, non sicuro che sia l'approccio migliore. – amitlicht
@eriks: perdite di memoria * possono * verificarsi in molte situazioni; anche se si passa un 'auto_ptr' per riferimento, qualcuno potrebbe chiamare 'delete ptr.get()' che sarebbe peggio. Passando i puntatori in base al valore non viene fornita alcuna informazione sul trasferimento di proprietà o sulla corretta forma di cancellazione, quindi - in assenza di documentazione contraria - non mi aspetto che il destinatario del messaggio elimini l'oggetto indicato. –
@eriks: non avrai perdite di memoria, riceverai solo puntatori penzolanti. – kennytm