2014-04-13 82 views
0

我有一個名爲「人類」級,並有人類的載體,我填充這樣說:爲什麼這個動態對象變得更改了?

humans.push_back(Human()); 

,並在另一個類,我指着這樣前面的人一個向量human*

cell.humans.push_back(&humans.back()) 

push_back函數在堆內存中創建對象,因此如果堆棧幀發生更改,對象將不會更改。但顯然,在一個不相關的函數定義像變量:

string foo = "a"; 

人類的一個屬性越來越無效,這是一個意外的行爲。 但是當我更改代碼在人類第一次矢量保持人類的這樣一個指針的方式:

humans.push_back(new Human()) 
cell.humans.push_back(humans.back()) 

的問題就解決了。調試程序,我甚至使用gdb並在更改的對象上設置了一個觀察點,但gdb在無限循環中獲得了庫存!

我該如何解釋這種行爲?

+0

顯示更多的代碼。你的問題還不夠清楚。使用一些智能指針。 –

回答

1

的push_back函數創建的堆內存的對象,因此,如果堆棧幀得到改變

是目標不會改變,但在這種情況下,對象只是一個指針。它的有效性取決於它指向的對象的有效性。如果對humans.back()的引用無效,則cell.humans'指針將被懸空。取消參考它們會導致未定義的行爲

0

原因很有趣。當你將一個新對象推回到一個向量中時,vector類可能會改變它的位置並將之前的對象複製到一個新的位置(在推回一個新對象之後),但是保留之前的指針現在是空閒的並且是無效的。

相關問題