2014-06-21 33 views
3

在下面的代碼中,我獲得了第一個元素std::vector v的每次不同的地址。爲什麼這樣?每次獲取不同的地址

#include <memory> 
#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> v; 

    for (int i=0; i<10; ++i) 
    { 
     int b = i; 

     v.push_back(b); 

     std::cout << std::addressof(v[0]) << std::endl; 
    } 

    return 0; 
} 

輸出:

0x603010 
0x603030 
0x603010 
0x603010 
0x603050 
0x603050 
0x603050 
0x603050 
0x603080 
0x603080 
+0

現在你明白爲什麼[我說](https://stackoverflow.com/questions/24345183/comparing-stdaddressof-with-hexadecimal-number#comment37638310_24345183)比較元素的地址與數值是沒用的? – Praetorian

+0

已經多次討論過重新分配 – texasbruce

回答

8

因爲新的內存可能需要分配給包含在當你調用

v.push_back(b); 

附註:矢量數據

你說:

在下面的代碼,我每次都遇到不同的地址的std ::矢量V的第一個元素爲什麼會這樣?

如果你看看你的輸出,這是不是每次:)

+0

是的,只要從'容量'函數返回的值發生變化,數據就會存儲在新的內存位置。 –

+0

@Shibli請注意,您可以爲您的矢量「預留」容量,以便在調用push_back時不需要調整大小:http://www.cplusplus.com/reference/vector/vector/reserve/ –

0

右真的,你不想獲得/使用/保存向量的元素的地址(通常,除非你不要在指針訪問和使用之間插入/擦除,但最好不要使用索引!)。雖然矢量將保持連續的保證,但可以在更大的連續內存塊上重新分配元素以適應不斷增加的容量需求。顯然,這不是一個說鏈接列表的情況,它不需要連續的內存。順便說一句,矢量迭代器面臨着同樣的「插入/刪除無效」問題作爲指向元素的指針。