2016-01-12 59 views
1
int main(int argc, char argv) 
{ 
    int myarray[] = {1, 2, 3, 5}; 
    std::vector<int> array(myarray, myarray + 4); 
    std::vector<int> *p = testvector(array); 
    std::vector<int>::const_iterator it; 
    for(it=p->begin(); it != p->end(); ++ it) 
    { 
     printf("%d ", *it); 
    } 
    return 0; 
} 

std::vector<int> *testvector(std::vector<int> array) 
{ 
    return &array; 
} 

以上是我的測試代碼;它有什麼不對呢0 0 3 5而不是1 2 3 5爲什麼矢量返回缺少一些值?

+5

您正在返回對臨時值的引用。這是未定義的行爲。 –

+0

'testvector'中的數組是您傳入的數組的副本。 –

回答

3

仔細看std::vector<int> *testvector(std::vector<int> array)。這是輸入參數array深拷貝

返回的指針將是懸掛一次array超出範圍。取消引用該指針的行爲將爲undefined。這就是爲什麼你的程序表現奇怪。

有趣的是,如果你寫了std::vector<int>& array作爲參數(即由參考傳遞),那麼這會工作,因爲你會返回一個指向main定義的載體!這個代碼將是極端雖然脆弱。

0

這樣的:

std::vector<int> *testvector(std::vector<int> array) 

應改爲:

std::vector<int> *testvector(std::vector<int>& array) 

Live Demo

然而,由於沒有從你的榜樣點,這是不是一個真正的解決方案。我認爲你有一個X問題,你只是發佈Y一個。如果你發佈你真正的問題,那將會更容易幫助你。

0

變化

std::vector<int> *testvector(std::vector<int> array) 

std::vector<int> *testvector(std::vector<int>& array) // Note the & 

否則陣列被複制到本地變量,該變量是在testvector()其端部返回的指針無效銷燬。