我想了解有关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();
感谢您的任何帮助。
关于'auto_ptr'的唯一理解是它被破坏了,不应该被使用。 –
@CaptainObvlious在某些情况下是完美的。如果你有C++ 11,那么没有理由使用它。但在C++ 03中,有时候没有好的选择。无论如何,这个问题是一个很好的问题,也适用于'unique_ptr'。 – juanchopanza
您可能想了解[Copy-Swap Idiom](http://stackoverflow.com/q/3279543/10077)。 –