【问题标题】:Re-assinging an "auto_ptr" and Managing Memory重新分配“auto_ptr”并管理内存
【发布时间】:2009-03-27 16:02:03
【问题描述】:

我有这样的情况:

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的默认析构函数中被释放吗?

【问题讨论】:

    标签: c++ memory-management memory-leaks auto-ptr


    【解决方案1】:

    是的,它会的。 你可以使用

    obj.reset( new MyOtherClass() );
    

    而且我最好使用这样的构造函数

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

    【讨论】:

    • Mykola,谢谢!我已经习惯了 Java,以至于我发现构造函数初始化列表令人反感,好像我不相信它分配了正确的值 :) 一个问题:即使对象不允许复制构造,我们也可以使用初始化列表吗?可能这就是为什么我不相信这个:)
    • 它不使用复制构造函数。它使用构造函数。
    【解决方案2】:

    来自MSDN,其中描述reset

    成员函数计算表达式 delete myptr,但前提是存储的指针值 myptr 由于函数调用而改变。然后它用 ptr 替换存储的指针。

    它会做你想做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多