2011-03-09 34 views
5

我使用以下方法來獲得分配的內存空間,而不用擔心如何回收分配的資源。C++ - 獲取一個向量的內部指針

#include <vector> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<int> vecInts; 

    for(int iInd=0; iInd<10; i++) 
     vecInts.push_back(iInd); 

    int* pInt = &vecInts[0]; // Is this a good method? 

    // now can I use pInt to modify the value of the vecInts? 
    // I will NOT resize the vector and just simply manipulate the values inside 
    return 0; 
} 

但是,我不確定這樣的方法是否是好的方法。

謝謝

回答

5

是的,這很好給你提到的注意事項(和其他明顯的,如不使用指針到該走了超出範圍等載體)。指針將會以與容器中的迭代器完全相同的方式有效且無效。

+0

我們可以稱之爲Hack嗎?由於std :: vector沒有提供一個名爲const T * Get的函數? - 謝謝 – q0987

+2

不,這不是黑客。一個向量應該用在C程序使用數組的地方。 –

+0

在我看來不合理。這是衆所周知的安全,有時是有用的。例如,http://en.wikipedia.org/wiki/Vector_(C%2B%2B)舉例說明了如何使用這樣一個指針來調用'memcpy'和'printf'。如果你更習慣使用迭代器,那麼你總是可以使用一個,即使可能只是獲得地址ala'&(* v.begin())'(類似地只有在'v.size()> 0時纔有效' )。 –

3

這是一個很好的方法。當向量超出範圍時,內存將自動釋放。在現代STL實現中,vector有一個方法data(),它將指針返回到內存的開始處,這相當於&v[0],但看起來更乾淨。

這種方法也有很好的屬性,每個元素都設置爲0(或默認構造,如果它是一個對象)。

爲了提高效率,如果事先知道向量的長度,可以將其作爲構造函數參數提供。然後所有的內存將被分配一次。例如。

vector<char> buffer(bufSize); 
fread(buffer.data(), 1, buffer.size(), file); 

而且,像你在評論提到,要知道,如果緩衝區大小buffer.data()會發生變化,而當它超出範圍釋放。