Question

Quand j'ai une classe qui contient des pointeurs comme variables membres quel type de pointeur intelligent devraient-ils avoir si je veux ne veulent pas utiliser des pointeurs simples? Ils ne doivent pas nécessairement être partagés (donc pas shared_ptr nécessaire). scoped_ptr ne fonctionnera pas car j'ai souvent besoin de construire les objets en dehors de la liste d'initialisation.

Ou est-il pratique peut-être courant d'utiliser un scoped_ptr lors de la création quand quelque chose peut encore échouer (exceptions lancées, etc.) et les assigner à la suite des pointeurs simples?

Était-ce utile?

La solution

Si vous êtes juste vouloir stocker des pointeurs membres dans une classe à puce de type pointeur de sorte que vous ne pouvez pas / ne pas oublier de les supprimer, alors un choix standard serait auto_ptr. Il est dans la STL et est facilement « remise à zéro » avec la fonction reset() lorsque vous devez libérer la mémoire allouée à courant et le remplacer par un nouvel objet.

Vous voulez toujours mettre en œuvre votre propre constructeur de copie et les opérateurs d'affectation pour les classes qui ont auto_ptr membres. Cela est dû au fait que l'affectation des auto_ptrs transferts opérateur propriété de l'objet sous-jacent si un opérateur d'affectation par défaut ne sera pas l'effet que vous voulez.

Voici ce que la classe pourrait ressembler à:

class X
{
public:
    X() :p(new ClassToManage) {}
    X(const X &copy)
        :p(new ClassToManage(*copy.p))
    {
    }

    X &operator=(const X &rhs)
    { 
        this->p.reset(new ClassToManage(*rhs.p));   
    }   

private:
    std::auto_ptr<ClassToManage> p;
};

Pour tous les autres cas, je suggère boost::shared_ptr. Shared_ptr ne fait le comptage de références, mais vous pouvez les stocker dans des conteneurs standards qui les rend très utile.

Vous devriez essayer finalement de vous débarrasser d'utiliser des pointeurs simples pour tout ce qui points mémoire allouée, il est responsable de l'effacement. Si vous souhaitez utiliser un pointeur simple pour accéder ou itérer sur un tableau ole plaine etc., c'est très bien (mais demandez-vous pourquoi vous n'êtes pas au moyen d'un std :: vector), mais quand vous les utilisez pour point quelque chose qui il est responsable de la libération, alors vous vous demandez des ennuis. Mon but lorsque le code d'écriture est de ne pas avoir supprime explicites.

Autres conseils

Vous pouvez utiliser std::auto_ptr, qui était disponible avant TR1 et donc votre code ne dépend pas d'un compilateur supportant TR1-smartpointers.

Normalement, j'utiliser un deep_copy_ptr. En ce moment, je ne connais loki smart_ptr et Axter pointeur intelligent qui font cela. Il permet la classe pointeur soit automatiquement copié un peu comme si elle était une variable membre normale (vous n'avez pas besoin de définir un opérateur d'affectation spéciale / constructeur par recopie).

Je pense que vous ne devez pas initialiser spécifiquement dans la liste d'initialisation (mais comme un pointeur normal, ne l'utilisez pas si elle ne dispose pas d'une valeur valide, évidemment).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top