2014-06-24 180 views
0

拿這個代碼,例如:爲什麼指向變量的指針保持有效?

int a = 1; 
int b = 2; 
int c = 3; 
std::vector<int> myVector; 
myVector.push_back(a); 
myVector.push_back(b); 
myVector.push_back(c); 
int * b_pointer; 
b_pointer = &myVector[1] 

以我的經驗b_pointer總是支持點b即使向量可以重新分配應做起來很b_pointer點垃圾數據。有沒有這種情況下,這將無法正常工作?

+4

'b_pointer'不指向'b',它指向存儲在'my_vector'中的第二個元素。 –

+0

@Captain如果我打電話給'myVector.erase(myVector.begin())','b_pointer still'有效嗎? – 0ctoDragon

+0

'迭代器/指針/引用無效'是你正在尋找的東西。如果重新分配,'.push_back()'使指針無效。 – milleniumbug

回答

4

你基本上是問是否一個迭代器保持有效(雖然,矢量迭代器的類型並不一定等同於簡單的指針)

std::vector<>::insert文檔說

如果重新分配發生時,與容器相關的所有迭代器,指針和引用 都將失效。否則,只有那些指向位置及以後的 被無效,所有迭​​代器, 指針和元素引用才能保證保持 引用它們在調用之前引用的相同元素。

您可能注意到的事情是,當realloc發生時,如果有可用空間,它有時會擴展當前分配。

+3

或者,realloc發生,將整個矢量數據複製到新的位置。舊位置仍然碰巧具有與以前相同的*值*,但並不保證這種方式。 –

0

經過myVector的內部緩衝區重新分配後,b_pointer會指向無效內存,簡單明瞭。解除引用會導致未定義的行爲。

但是,它指向的內存很可能仍然包含之前保存的數據;爲什麼有些人會以某種方式支付搗毀它的代價?無論如何,沒有人合法能夠訪問它。如果在此期間發生足夠的分配,它最終會被別的東西覆蓋。

相關問題