1

私はこのような状況を持っています:

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か?

4

2 に答える 2

4

はい、そうなります。使用できます

obj.reset( new MyOtherClass() );

そして、私はそのようなコンストラクターを使用したほうがいいです

 MyClass():
     obj( new MyOtherClass() )
 {
 }
于 2009-03-27T16:05:17.543 に答える
1

記述しているMSDNからreset

メンバー関数は、式delete myptrを評価しますが、関数呼び出しの結果として、格納されているポインター値myptrが変更された場合に限ります。次に、格納されているポインタをptrに置き換えます。

それはあなたが望むことをします。

于 2009-03-27T16:09:46.547 に答える