2013-03-19 78 views
0

我有一個類對象的向量。一個函數隨機選擇兩個元素並返回它們的地址。向量回推對元素地址的影響

現在使用這兩個元素,我想要生成兩個相同類的新對象,並使用push_back將它們添加到向量中。

這裏是兩個父元素的地址:

這裏沒問題。然後生成第一個子對象,然後使用vector_pushback將其添加到向量的末尾。問題是,在執行push_back命令後,父對象的地址似乎發生了變化。這裏是push_back之後的調試器的狀態:

正如你所看到的,地址顯然保持不變,但它看起來像是指向push_back之後的垃圾值。據我瞭解,push_back在向量的末尾添加一個元素。因此我預計這兩個元素的地址根本不會改變。

怎麼了?

回答

7

TL; DR版本:

An insertion operation can invalidate any pointers, references or iterators to elements of a std::vector.

完整的解釋:

std::vector具有兩個有用指標:

  • size,這是元素的數量存儲。
  • capacity,這是它當前能夠存儲的元素的數量。

capacity >= size在任何時候。

capacity是內部動態分配數組的長度。 *插入元素時,size增加1。但一旦達到capacity,必須分配一個新的更大的數組(因此增加capacity)。這要求將所有元素複製到一起,並刪除原稿。所以他們的地址都改變了。


*這是std::vector的典型內部實現。

+0

TL; DR,+1無論如何 – 2013-03-19 22:33:16

+0

哇,我希望有一個+2按鈕 – 2013-03-19 23:01:03

2

push_back罐導致的重新分配和移動的在矢量中的所有元素,如果目前指定用於存儲元件的空間不能包含新元素。