2012-06-23 141 views
0

這是使用的unique_ptr代碼:有人可以解釋這個unique_ptr代碼發生了什麼嗎?

struct Foo{ 
    Foo(){std::cout << "Ctor called\n";} 
    ~Foo(){std::cout << "Dtor called\n";} 
    void bar(){std::cout << "bar called\n";} 
} 

int main(){ 
unique_ptr<Foo> up(new Foo); 
{ 
    vector<unique_ptr<Foo>> v; 
    v.push_back(move(up)); 
} 

up->bar(); 
return 0; 
} 

運行的輸出是:

Ctor called 
Dtor called 
bar called 

我期待調用bar()失敗,因爲據我瞭解,up本來是要由於move ing會被v破壞。看起來我沒有正確理解。有人可以引導我瞭解發生的事情嗎? (g ++ 4.7.0)

+1

未定義的行爲未定義爲顯示失敗。 – Pubby

回答

3

你看到的是未定義的行爲,由最後一次調用up->bar()造成的。它可能是相同的,如果你嘗試:

static_cast<Foo*>(0)->bar(); 

注意未定義行爲的真正含義不確定,所以它可能會崩潰還是有些完全出人意料,就像出現好的工作。編譯器也可以理解,最後一行代碼永遠不會到達(在定義的行爲下),並決定生成一個空的可執行文件,它根本就什麼也不做。

+0

那就對了。案件結案。 – badmaash

3

從我所瞭解,up應該得到與v因爲move ING的破壞。

它被毀壞了。爲什麼"Dtor called"會在輸出中顯示?一個對象在析構函數執行時被銷燬。沒有其他的魔法發生。

我期待調用bar()失敗

你不能指望任何時候的行爲是不確定的,這是訪問一個空unique_ptr的情況。

相關問題