Étant donné la situation courante où la durée de vie d'un objet possédé est liée à son propriétaire, je peux utiliser un pointeur unique de deux manières. .
Il peut être attribué:
class owner
{
std::unique_ptr<someObject> owned;
public:
owner()
{
owned=std::unique_ptr<someObject>(new someObject());
}
};
La méthode de réinitialisation peut être utilisée:
class owner
{
std::unique_ptr<someObject> owned;
public:
owner()
{
owned.reset(new someObject());
}
};
Dans l'intérêt des meilleures pratiques, devrais-je préférer une forme à l'autre?
EDIT: Désolé les gens. J'ai trop simplifié cela. L'allocation de segment de mémoire se produit dans une méthode d'initialisation et non dans le ctor. Par conséquent, je ne peux pas utiliser de listes d'initialisation.
De les documents de unique_ptr
De operator=
:
Transfère la propriété de l'objet pointé par r à * ceci comme si en appelant
reset(r.release())
suivi d'une affectation destd::forward<E>(r.get_deleter())
.
Et tout ce dont vous avez besoin est l'appel reset
, il est donc plus simple de l'appeler directement
La bonne façon de faire cela (que vous n'avez pas répertorié) est d'utiliser le constructeur de owned
:
owner() : owned(new someObject())
{}
En dehors de cela, je préférerais reset
car vous ne créez pas d'instance intermédiaire inutile dans ce cas (même s'il n'y a pas de différence au niveau de la machine car l'optimiseur peut faire beaucoup de choses là-bas).