2012-12-28 44 views
4

即時通訊新的c + +我很難理解一些向量行爲。 我試圖實現一個函數返回一個int數組,我發現很多建議使用這樣的載體:棧std ::向量範圍

vector<int> myFunc() 
{ 
    vector<int> myVector; 
    //add elements to vector here... 
    return myVector; 
} 

但是從我知道「myVector」是在棧上創建一個對象,所以當函數結束時它不會超出範圍嗎?什麼時候它的析構函數被調用? 我知道還有其他一些關於返回矢量的問題,但我需要澄清這個特定的問題,希望不會有重複的問題。

+3

它被複制/移動(或優化出)。它返回可能導致問題的本地對象的地址或引用。 – chris

+0

關於這個問題,有很多關於SO的問題。你可能會發現它們([sample](http://stackoverflow.com/questions/12604431/returning-an-stl-vector-from-a-function-copy-cost))的啓發。 – WhozCraig

回答

9

是因爲myVector是儘快分配在棧上,作爲函數返回時,它超出範圍。但在這種情況下,沒關係!你的函數簽名是

vector<int> myFunc() 

返回一個複製的myVector所以不要緊,它走出去的範圍,因爲它已經被複制的回報。

但是如果你把它改成像

vector<int> & myFunc() 

現在你告訴它不要複製myVector,你就會有一個問題稱爲叼着參考因爲myVector將被破壞,而你沒有複製它,但仍然嘗試使用它。

+0

所以這是矢量特定?我的意思是這是好的,因爲矢量有一個副本構造函數,也複製動態分配的內部數據? –

+0

遵循3的規則(或自C++ 11 5以來),任何設計良好的類容器都是如此。對於沒有內部動態數據的類,他們會免費獲得這個。 – jozefg

0

您的代碼返回堆棧上myVector實例的副本。所以它可以超出範圍並被刪除(返回後)。

+3

複製或移動,具體取決於是否支持C++ 11移動ctors。 –

0

它超出了範圍,但是當你返回一個類或結構體時,編譯器會自動爲你創建一個副本,以便接收對象被填充原始對象的內容。

到類似:

vector<int> a; 
vector<int> b; 

... fill in vector a with stuff ... 

b = a;