es la siguiente función OK:¿Puedo pasar auto_ptr por referencia a las funciones?
void DoSomething(auto_ptr< … >& a)....
es la siguiente función OK:¿Puedo pasar auto_ptr por referencia a las funciones?
void DoSomething(auto_ptr< … >& a)....
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.
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
@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. –
@eriks: No tendrá fugas de memoria, solo obtendrá punteros colgantes. – kennytm