2016-08-23 1 views
6

Consultez le code suivant:Est-ce que get() est fiable quand un auto_ptr n'est pas initialisé?

std::auto_ptr<std::string> p; 

if (p.get() == 0) { 
    ... 
} 

est la fonction de membre get() manière standard et fiable pour vérifier que p n'a pas été initialisé? Va-t-il toujours renvoyer 0, indépendamment de la plate-forme, du compilateur, des indicateurs d'optimisation du compilateur, etc.?

+4

Dans cet exemple, 'auto_ptr' est * non *" non initialisé ". Le constructeur par défaut initialise le pointeur sur un pointeur NULL. –

Répondre

1

La méthode get de auto_ptr n'a pas conditions préalables.

Cela signifie, il est toujours sûr d'appeler cette méthode, peu importe dans quel état l'objet auto_ptr est.

contraste avec la fonction de membre operator*, qui a une condition préalable get() != 0. La norme C++ spécifie des conditions préalables pour les fonctions membres dans une clause . Si aucune clause n'est présente pour une fonction, il est toujours possible d'appeler en toute sécurité.

11

Il n'y a pas une telle chose comme un non initialisée std::auto_ptr, le default constructor initialise le pointeur vers 0:

explicit auto_ptr(X* p = 0); 

Ainsi get() se retourne efficacement "0" sur un défaut construit std::auto_ptr.

3

La ligne

std::auto_ptr<std::string> p; 

appels the constructor

explicit auto_ptr (X* p=0) throw(); 

qui initialise le pointeur interne à 0.

Il dépend donc, ce que vous entendez par "n'a pas été initialisé". L'appel de la cteur par défaut, que vous montriez, donnera un get qui retourne 0. En outre initialisant à quelque chose d'autre, suivi d'un appel à reset(0), donnera un get qui retourne 0.

+0

Lorsque je travaille avec plusieurs plates-formes, puis-je me fier au constructeur par défaut (sans avoir à vérifier chaque implémentation) ou dois-je appeler explicitement reset (0) pour être sûr? – Marc

+1

Non, il n'est pas nécessaire d'appeler explicitement 'reset' après le ctor par défaut. –