为什么这个动态对象会发生变化?

时间:2014-04-13 08:01:47

标签: c++ pointers stack

我有一个名为" Human"并且有一个人类的载体,我这样填充它:

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在无限循环中获得了库存!!!

我该如何解释这种行为?

2 个答案:

答案 0 :(得分:1)

  

push_back函数在堆内存中创建一个对象,因此如果堆栈帧发生更改,对象将不会更改

是的,但在这种情况下,该对象只是一个指针。它的有效性取决于它指向的对象的有效性。如果对humans.back()的引用失效,则cell.humans'指针会悬空。取消引用它们将导致未定义的行为

答案 1 :(得分:0)

原因很有趣。当你将一个新对象推回到一个向量中时,向量类可以改变这个位置并将之前的对象复制到一个新位置(在推回一个新对象之后),但是在哪里保留现在空闲且无效的前一个指针。