2014-02-14 134 views
4

我想了解有关auto_ptr类如何工作的某些细节。假设你有以下课程(我在一个网站上发现了这个人,他解释了赋值运算符的更精细的点)。试图了解auto_ptr

class TFoo : public TSuperFoo { 
    auto_ptr<TBar> fBar1; 
    auto_ptr<TBar> fBar2; 
public: 
    TFoo& TFoo::operator=(const TFoo& that); 
    // various other method definitions go here... 
} 

现在执行赋值操作符。

TFoo& TFoo::operator=(const TFoo& that) 
{ 
    if (this != &that) { 
     auto_ptr<TBar> bar1 = new TBar(*that.fBar1); 
     auto_ptr<TBar> bar2 = new TBar(*that.fBar2); 

     fBar1 = bar1; 
     fBar2 = bar2; 
    } 
    return *this; 
} 

他接着说

在这里,如果第二个新的操作失败,第一个新TBAR将由auto_ptr的析构函数,当我们退出该功能删除。但是,如果两个new都成功了,那么赋值将会删除先前指向的对象fBar1和fBar2,并且也会将bar1和bar2清零,以便在我们退出函数时它们的析构函数不会删除任何内容。

所以我的问题是为什么bar1和bar2会被清零?什么会触发呢?你不需要像

fBar = bar1.release(); 

感谢您的任何帮助。

+1

关于'auto_ptr'的唯一理解是它被破坏了,不应该被使用。 –

+0

@CaptainObvlious在某些情况下是完美的。如果你有C++ 11,那么没有理由使用它。但在C++ 03中,有时候没有好的选择。无论如何,这个问题是一个很好的问题,也适用于'unique_ptr'。 – juanchopanza

+0

您可能想了解[Copy-Swap Idiom](http://stackoverflow.com/q/3279543/10077)。 –

回答

4

auto_ptr的赋值运算符将该对象的所有权转让给受让人,从而有效释放该对象从中分配的auto_ptr。因此,赋值运算符的语义相当违反直觉。这可能是为什么auto_ptr已被弃用并应被替换为unique_ptr的主要原因。

+0

好的谢谢。但我仍然想明白......我猜想一个更基本的C++问题困扰着我。 bar1是被分配的人。所以它不知道自己归零,对吧?因此我猜测,因为fBar1也是一个auto_ptr它必须将bar1置于fBar1的赋值运算符中,这听起来是否正确?感谢所有的答案。 – driftwood

+1

@ user2722568:没错。在目标操作数'fBar1'上调用的赋值运算符修改其源操作数'bar1'。 –

+0

好,非常感谢。原作者的(Tbar/TFoo类)语言令我感到困惑。 – driftwood