2014-02-14 177 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