我有一个名为" 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在无限循环中获得了库存!!!
我该如何解释这种行为?
答案 0 :(得分:1)
push_back函数在堆内存中创建一个对象,因此如果堆栈帧发生更改,对象将不会更改
是的,但在这种情况下,该对象只是一个指针。它的有效性取决于它指向的对象的有效性。如果对humans.back()
的引用失效,则cell.humans
'指针会悬空。取消引用它们将导致未定义的行为。
答案 1 :(得分:0)
原因很有趣。当你将一个新对象推回到一个向量中时,向量类可以改变这个位置并将之前的对象复制到一个新位置(在推回一个新对象之后),但是在哪里保留现在空闲且无效的前一个指针。