El constructor de unique_ptr<T>
acepta un puntero sin formato a un objeto de tipo T
(por lo tanto, acepta a T*
).
En el primer ejemplo:
unique_ptr<int> uptr (new int(3));
El puntero es el resultado de una new
expresión, mientras que en el segundo ejemplo:
unique_ptr<double> uptr2 (pd);
El puntero se almacena en la pd
variable.
Conceptualmente, nada cambia (está construyendo un a unique_ptr
partir de un puntero sin formato), pero el segundo enfoque es potencialmente más peligroso, ya que le permitiría, por ejemplo, hacer:
unique_ptr<double> uptr2 (pd);
unique_ptr<double> uptr3 (pd);
Por lo tanto, tener dos punteros únicos que encapsulan efectivamente el mismo objeto (violando así la semántica de un puntero único ).
Por eso, la primera forma para crear un puntero único es mejor, cuando es posible. Tenga en cuenta que en C ++ 14 podremos hacer:
unique_ptr<int> p = make_unique<int>(42);
Lo que es más claro y seguro. Ahora con respecto a esta duda tuya:
Lo que tampoco me queda claro es cómo los punteros, declarados de esta manera, serán diferentes de los punteros declarados de una manera "normal".
Se supone que los punteros inteligentes modelan la propiedad del objeto y se encargan automáticamente de destruir el objeto puntiagudo cuando el último puntero (inteligente, propietario) a ese objeto queda fuera de alcance.
De esta manera, no tiene que recordar haber hecho delete
en objetos asignados dinámicamente (el destructor del puntero inteligente lo hará por usted) ni preocuparse por si no eliminará la referencia de un puntero (colgante) a un objeto que ya ha sido destruido:
{
unique_ptr<int> p = make_unique<int>(42);
}
Ahora unique_ptr
es un puntero inteligente que modela la propiedad única, lo que significa que en cualquier momento de su programa habrá solo un puntero (propietario) al objeto puntiagudo, por eso unique_ptr
no se puede copiar.
Siempre que use punteros inteligentes de una manera que no rompa el contrato implícito que requieren que cumpla, tendrá la garantía de que no se filtrará memoria y se aplicará la política de propiedad adecuada para su objeto. Los punteros crudos no le dan esta garantía.
new int(3)
devuelve un puntero al nuevoint
, como sipd
fuera un puntero al nuevodouble
.