2009-03-27 10 views
1

Ich habe eine Situation wie folgt aus:Re-assinging eine "auto_ptr" und Speicher verwalten

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 
    } 
}; 

Gibt es eine Möglichkeit, dies zu erreichen? Wird der folgende Code tun, was ich will?

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

Wird die Erinnerung an new_other_class in der Standard-Destruktor MyClass de zugewiesen werden?

Antwort

4

Ja wird es. Sie können

obj.reset(new MyOtherClass()); 

verwenden und ich würde eine bessere Nutzung solcher Konstruktor

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

Mykola, danke! Ich bin so an Java gewöhnt, dass ich die Initialisierungsliste des Konstruktors abstoßend finde, als ob ich nicht traue, dass er die richtigen Werte zuweist :) Eine Frage allerdings: Können wir die Initialisierungsliste verwenden, selbst wenn das Objekt den Kopieraufbau nicht erlaubt? Vielleicht traue ich deshalb nicht :) – Srikanth

+0

Es verwendet keinen Kopierkonstruktor. Es verwendet Konstruktor. –

1

Von MSDN wo reset

Beschreibung der Memberfunktion der Ausdruck myptr löschen auswertet, aber nur, wenn die Der gespeicherte Zeigerwert myptr ändert sich als Ergebnis des Funktionsaufrufs. Es ersetzt dann den gespeicherten Zeiger durch ptr.

Es wird tun, was Sie wollen.

Verwandte Themen