2010-03-21 9 views

Respuesta

17

Puede hacerlo, pero no estoy seguro de por qué desea hacerlo.

Si está utilizando el auto_ptr para indicar la propiedad del ptr (como generalmente lo hace la gente), solo necesita pasar el auto_ptr a una función si desea transferir la propiedad del ptr a la función, en la cual caso de que le pase el auto_ptr por valor:

void DoSomething(auto_ptr<int> a) 

por lo que cualquier código de llamada HacerAlgo renunciase a la propiedad de los PTR:

auto_ptr<int> p (new int (7)); 
DoSomething (p); 
// p is now empty. 

de lo contrario sólo tiene que pasar el PTR por valor:

void DoSomething(int* a) 
{...} 

... 

auto_ptr<int> p (new int (7)); 
DoSomething (p.get()); 
// p still holds the ptr. 

o pasar una referencia al objeto puntiagudo para:

void DoSomething(int& a) 
{...} 

... 

auto_ptr<int> p (new int (7)); 
DoSomething (*p); 
// p still holds the ptr. 

La segunda suele ser preferible, ya que hace que sea más explícito que HacerAlgo es poco probable que intente eliminar el objeto.

+1

pasando el puntero por valor no es seguro; podrían producirse pérdidas de memoria. crear el objeto sin 'nuevo' significa que el objeto estará en la pila; no estoy seguro de que sea el mejor enfoque tampoco. – amitlicht

+2

@eriks: Las pérdidas de memoria * pueden * ocurrir en muchas situaciones; incluso si pasa un 'auto_ptr' por referencia, alguien podría llamar a' eliminar ptr.get() 'que sería peor. Al pasar punteros por valor, no se obtiene información sobre la transferencia de propiedad o la forma correcta de eliminación, por lo que, en ausencia de documentación en contrario, no esperaría que el destinatario borre el objeto al que se apunta. –

+0

@eriks: No tendrá fugas de memoria, solo obtendrá punteros colgantes. – kennytm

Cuestiones relacionadas