2014-01-19 55 views
-3

的開始,我想我應該以詳細的方式描述了這個問題。如何返回一個指針INT,指出矢量<int>

class solution{ 
public: 
    int* function(int para){ 
    //clear ret 
    ret.clear(); 
    //some lines to manipulate the ret; 
    //........... 
    return ret.data(); 
    } 
private: 
std::vector<int> ret; 
} 

我很喜歡使用像這樣的指針。但是設計要求假定使用int *作爲返回。那麼,這種方法是否可以保證函數返回指針可用?

+1

['vec.data()'](http://en.cppreference.com/w/cpp/container/vector/data) – Borgleader

+2

@Borgleader在這種情況下未定義的返回值 –

+0

如果您要返回一個指針在第一個元素'vec'因爲'vec'是按值傳遞,並將在函數結束時被銷燬,你會得到不確定的行爲。 –

回答

1

您在這裏有一個普遍的問題:

int* function(std::vector<int> vec){ 

} 

如果傳遞一個向量這個功能的本地副本在函數調用期間建造只可儘快(如多數民衆贊成在其範圍內),作爲你的函數返回,該矢量被破壞,並且可能的返回指針因此失效。爲了解決這個問題,我們必須通過引用傳遞:

int* function(std::vector<int>& vec) 

現在,我們可以通過獲取指針:

return vec.data(); 

但是請注意,這個功能是相當無意義的,因爲你可以簡單地調用方法(data())直接在你的vector上,而不是將它傳遞給一個函數。

3
// NOT: int* function(std::vector<int> vec){ 
int* function(std::vector<int>& vec){ // see & here 
    if(vec.empty()){ 
     return nullptr; // nullptr is more meaningful for pointers 
    } 
    return vec.data(); 
    // OR: return &vec.front(); 
} 
// On each update of the vector&, update the pointer also 
// as the memory location MAY change. 
// And obviously, the vector& must outlive the pointer. 

你需要一個參考&。你不能像你的參數那樣返回一個有效的臨時局部變量的指針。

+0

如果它是我定義的類,可以將輸入vec保存到我自己的專用vec中,然後使用return vec.data()? – user2840454

+0

@ user2840454 **只要需要使用指針,矢量變量就必須存在。如果你調整它的大小,請更新指針,因爲它可能會移動。** ---這是規則,讓它在你的設計中工作。 – CodeAngry

0

int* function(std::vector<int> vec)你被調用值時function(my_vector)編譯器會通過調用拷貝構造函數創建的my_vector副本,此副本將生活瞬間的程序控制流輸入之間只傳遞參數,因此這樣的功能你功能以及控制流程退出您的功能的時刻。

所以你不能在此背景下返回一個指針到矢量的開頭,因爲當你退出該功能也不會存在了。這是調用「返回一個臨時的」,這是非常糟糕的,因爲你的程序在訪問這個指針時可能會崩潰。

做你想做什麼,你可以通過引用傳遞您的載體:int* function(std::vector<int>& vec)然後調用vec.data()

int* function(std::vector<int>& vec) 
{ 
    return vec.data(); 
} 

但請,如果可以,用std::vector工作和不亂用指針。

+2

** OP **:*將最後一句作爲好建議*如果您問這個問題,您還沒有準備好使用原始指針。 – CodeAngry