2010-03-21 13 views

risposta

17

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.

+1

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

+2

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

+0

@eriks: non avrai perdite di memoria, riceverai solo puntatori penzolanti. – kennytm

Problemi correlati