web-dev-qa-db-fra.com

Dois-je attribuer ou réinitialiser un unique_ptr?

É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.

60
learnvst

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 de std::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

38
Kos

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).

15
filmor