IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

auto_ptr sur pointeur nul.


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut auto_ptr sur pointeur nul.
    Bonjour
    J'ai un objet qui est un auto_ptr, déclaré comme ceci où A est une classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::auto_ptr<A>  uneInstance;
    je voudrais savoir s'il est possible de faire en sorte que le pointeur soit un pointeur vide. Le pointeur 0. (Car dans certains cas, il faut que ce pointeur soit vide).

    Je ne sais pas quelles sont les infos sur la classe A, mais je suis prêt a en envoyer s'il le faut.

    Merci

  2. #2
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Oui, il n'y a pas de souci.
    Un pointeur intelligent reste valide même s'il ne pointe sur aucune donnée.
    Comme un pointeur nu, en fait... (à condition que sa valeur soit NULL)

    Mais, tu es sûr que c'est std::auto_ptr qu'il te faut ?
    Il y a des classes de pointeur intelligent bien meilleures.
    Avec celle-là, il faut prendre ses précautions...
    F.A.Q. C++: Pourquoi faut-il se méfier de std::auto_ptr ?

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Oui, mais comment l'initialiser?

    Il est déclaré comme ceci dans la classe. C'est un attribut privé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::auto_ptr<A> uneInstance;
    Ensuite, si je fais:
    uneInstance = 0
    ou uneInstance=NULL, il aime pas.

  4. #4
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    En fait, je peux faire:

    Echeancier_.reset(0);

    mais qu'en pensez vous?


    Edit:
    d'un autre coté, comme on voit ici que dans le constructeur, le pointeur sous jacent est bien à 0, je me demande s'il est nécessaire de le setter à 0.
    explicit auto_ptr (X* p=0) throw();
    http://www.cplusplus.com/reference/s..._ptr/auto_ptr/

  5. #5
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    C'est marrant, dans ma première réponse j'étais d'abord parti sur un laïus sur le constructeur « normal »/par défaut et les fonctions release et reset, mais finalement je me suis ravisé.
    J'aurais peut-être dû continuer...

    Bref, comme tu viens de le faire remarquer, le constructeur par défaut de std::auto_ptr rend le pointeur sous-jacent nul.
    De même que release et reset, si on ne fourni pas d'autre pointeur.
    Donc pas besoin de te prendre la tête si tu veux l'initialiser avec un pointeur nul.


    Citation Envoyé par deubelte Voir le message
    Ensuite, si je fais:
    uneInstance = 0
    ou uneInstance=NULL, il aime pas.
    Tu as sans doute remarqué le mot-clé explicit devant la déclaration du constructeur.
    Il sert à empêcher les conversions implicites pour les constructeurs qui acceptent un seul argument.
    Autrement dit, il faut appeler explicitement ledit constructeur pour que ça compile.

    Dans ton cas, l'instruction correcte serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneInstance = std::auto_ptr<A>(/*0*/); // ou NULL
    Sans le mot-clé explicit, tes deux instructions seraient valides.
    En passant, c'est grâce à l'absence de ce mot-clé que l'on peut convertir implicitement (donc sans appeler explicitement le constructeur) un char const * en std::string.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retour new sur pointeur alloué à nul
    Par MicBeastKiller dans le forum Débuter
    Réponses: 34
    Dernier message: 22/11/2012, 10h02
  2. Pointeur nul sur une vidéo, problème de codec ?
    Par HellHammer dans le forum OpenCV
    Réponses: 0
    Dernier message: 13/03/2009, 10h58
  3. Besoin d'aide sur pointeur
    Par SebRs dans le forum C++
    Réponses: 2
    Dernier message: 18/05/2006, 10h21
  4. Iterateur sur pointeur de vector
    Par Pragmateek dans le forum SL & STL
    Réponses: 9
    Dernier message: 13/05/2006, 13h50
  5. pointeur sur pointeur
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 01/11/2005, 21h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo