Повторное получение "auto_ptr" и управление памятью - PullRequest
1 голос
/ 27 марта 2009

У меня такая ситуация:

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

Есть ли способ достичь этого? Будет ли следующий код делать то, что я хочу?

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

Будет ли выделена память new_other_class в деструкторе по умолчанию MyClass?

Ответы [ 2 ]

4 голосов
/ 27 марта 2009

Да, будет. Вы можете использовать

obj.reset( new MyOtherClass() );

И я бы лучше использовал такой конструктор

 MyClass():
     obj( new MyOtherClass() )
 {
 }
1 голос
/ 27 марта 2009

С MSDN , где описывается reset

Функция-член оценивает выражение delete myptr, но только в том случае, если сохраненное значение указателя myptr изменяется в результате вызова функции. Затем он заменяет сохраненный указатель на ptr.

Он будет делать то, что вы хотите.

...