2010-04-05 3 views
3

Je lis here à propos std :: auto_ptr <> :: operator =devrait std :: auto_ptr <> :: operator = réinitialiser/désallouer sa pointee existante?

Avis cependant que le côté gauche objet est pas automatiquement désallouée quand il fait déjà un objet. Vous pouvez explicitement faire en appelant la fonction membre réinitialiser avant de lui affecter une nouvelle valeur.

Cependant, quand je lis le code source pour le fichier d'en-tête C:\Program Files\Microsoft Visual Studio 8\VC\ce\include\memory

template<class _Other> 
    auto_ptr<_Ty>& operator=(auto_ptr<_Other>& _Right) _THROW0() 
    { // assign compatible _Right (assume pointer) 
    reset(_Right.release()); 
    return (*this); 
    } 

auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Right) _THROW0() 
    { // assign compatible _Right (assume pointer) 
    reset(_Right.release()); 
    return (*this); 
    } 

auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty> _Right) _THROW0() 
    { // assign compatible _Right._Ref (assume pointer) 
    _Ty **_Pptr = (_Ty **)_Right._Ref; 
    _Ty *_Ptr = *_Pptr; 
    *_Pptr = 0; // release old 
    reset(_Ptr); // set new 
    return (*this); 
    } 

Quel est le comportement correct/standard? Comment se comportent les autres implémentations STL? Si le site Web mentionné ci-dessus contient des informations erronées/périmées, quel site recommandez-vous comme référence?

+0

Je prédis que vous obtiendrez au moins 3 réponses vous avertissant de ne pas utiliser auto_ptr. Je voudrais avoir la norme à portée de main, afin que je puisse vérifier votre référence. –

+1

Je ne vais pas mettre une réponse, mais je vais ajouter ce * commentaire * que vous ne devriez pas utiliser 'auto_ptr'. Utilisez 'boost :: scoped_ptr' ou' boost :: shared_ptr' à la place. – rlbond

+1

En tant que FYI, j'ai soumis un rapport d'erreur sur cplusplus.com. Je ne sais pas s'ils corrigent activement les erreurs de contenu. –

Répondre

6

Si le auto_ptr affecté à contient déjà un pointeur, ce pointeur doit d'abord être supprimé.

de la norme 2003 (§20.4.5.1):

auto_ptr& operator=(auto_ptr& a) throw(); 

7 Nécessite: L'expression delete get() est bien formé.

8 Effets: reset(a.release()).

9 Retourne: *this.

Ainsi, l'affectation à un auto_ptr a le même effet que d'appeler reset dessus avec le pointeur libéré du côté droit auto_ptr.

Le site Web que vous regardez est incorrect.

+0

Avez-vous des liens à cliquer? (lien vers les normes/autres références que je peux utiliser pour un usage quotidien) –

+0

Vous devez acheter la spécification 2003 si vous le souhaitez. Vous pouvez obtenir le projet de comité final (FCD) de la norme C++ 0x ici: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf (notez que c'est pas définitif, officiel ou normatif). –

+1

@afriza: Indice secret: Google pour "14882 pdf" – Potatoswatter

Questions connexes