2013-10-04 91 views
0

我有性病問題:: vector的不能把一個元素的指針在一個std向量

class myType 
{ 
    int i; 
}; 

int main() 
{ 
    myType a1; 
    myType a2; 
    std::vector<myType> V; 
    V.push_back(a1); 
    myType* a1ptr = &V.back(); 
    V.push_back(a2); 
} 

這一切工作正常之前,我添加A2,在PTR被點到一些有意義的記憶。 但一旦我添加了a2,ptr仍然指向相同的地方,但有一些垃圾內存。

這是怎麼回事?

回答

0

當您向矢量中添加a2時,矢量必須調整大小。這意味着分配新的內存並將舊的矢量複製到這個新的(較大的)內存中。舊的內存然後被釋放。你的指針懸在這個(舊)釋放的內存中。

如果您構建具有大小的向量,即std :: vector V(2),則向量不得不調整大小,並且指針將保持指向a1的值。

+0

看來,std :: vector V(2)不只是分配內存,它也試圖填充它會違反默認構造函數的兩個實例,因爲我沒有在我的情況下默認constrcutor,它失敗。 – cynric4sure

+0

而且,即使我有一個默認的構造函數。這將是我的向量中已有2個元素,在我調用push_back之後,向量大小變爲3 – cynric4sure

+0

如果您沒有默認構造函數,那麼您可以定義std :: vector然後使用reserve()來調整它的大小。這也將停止調整大小,並允許您像使用代碼一樣使用push_back()。如果向量在構建時被調整大小,那麼你可以使用普通索引而不是push_back。 – user2746401

相關問題