2009-03-27 7 views
1

J'ai une situation comme celle-ci:Re-assinging un "auto_ptr" et gérer la mémoire

class MyClass 
{ 
private: 
    std::auto_ptr<MyOtherClass> obj; 

public: 
    MyClass() 
    { 
    obj = auto_ptr<MyOtherClass>(new MyOtherClass()); 
    } 

    void reassignMyOtherClass() 
    { 
    // ... do funny stuff 
    MyOtherClass new_other_class = new MyOtherClass(); 
    // Here, I want to: 
    // 1) Delete the pointer object inside 'obj' 
    // 2) Re-assign the pointer object of 'obj' to 'new_other_class' 
    //  so that 'obj' now manages 'new_other_class' instead of the 
    //  object that just got deleted manually 
    } 
}; 

Yat-il un moyen d'y parvenir? Est-ce que le code suivant fera ce que je veux?

void MyClass::reassignMyOtherClass() 
{ 
    // ... still, do more funny stuff (flashback humor :-) 
    MyOtherClass new_other_class = new MyOtherClass(); 
    obj.reset(new_other_class); 
} 

Est-ce que la mémoire de new_other_class être désallouée dans le destructor par défaut de MyClass?

Répondre

4

Oui, il le fera. Vous pouvez utiliser

obj.reset(new MyOtherClass()); 

Et je ferais mieux utiliser ce constructeur

MyClass(): 
    obj(new MyOtherClass()) 
{ 
} 
+0

Mykola, merci! Je suis tellement habitué à Java que je trouve la liste d'initialisation du constructeur répulsive, comme si je ne crois pas qu'elle assigne les bonnes valeurs :) Une question cependant: pouvons-nous utiliser la liste d'initialisation même si l'objet interdit la construction de la copie? Peut-être est-ce la raison pour laquelle je ne fais pas confiance à ceci :) – Srikanth

+0

Il n'utilise pas de constructeur de copie. Il utilise le constructeur. –

1

De MSDN où la description reset

La fonction membre évalue l'expression supprimer myptr, mais seulement si le La valeur du pointeur stockée change à la suite de l'appel de la fonction. Il remplace ensuite le pointeur enregistré avec ptr.

Il fera ce que vous voulez.

Questions connexes