在函数调用期间重新分配的 std::vector 元素的调用函数是否会引起麻烦?
Does calling functions of an element of an `std::vector` which gets reallocated during the function call cause trouble?
我有 std::vector
个 GameObject
。我使用直接指向它们的指针来访问这些 GameObject
。 (不用担心指针会失效,我会在 vector
重新分配自身时更新指针)。 GameObject
class 有一个函数叫做 load()
.
因此,在一种情况下,我调用存储在 vector
中的 GameObject
实例的 load()
。此函数将另一个 GameObject
推到 vector
的后面。这会导致 vector
到 运行 内存不足并重新分配。(或调整大小)。现在,对 push_back
returns 的调用,load()
无法再访问任何 GameObject
实例的成员。该实例仍然存在于同一个向量上。
为什么函数无法访问成员? load
看到的成员包含 junk/incorrect 值。有什么解释吗?
vector
不会魔法。它必须通过使用它们的移动构造函数(如果可能)或复制构造函数来移动元素,然后销毁先前位置的旧对象。
因此,在您的情况下,将针对您调用 GameObject::load
的对象调用 GameObject::~GameObject
。当然,在 其他地方 有另一个逻辑上相同的对象,但是当 load
returns 时你的 this
指针无效。 vector
无法在通话进行时更新您的 this
指针。
我有 std::vector
个 GameObject
。我使用直接指向它们的指针来访问这些 GameObject
。 (不用担心指针会失效,我会在 vector
重新分配自身时更新指针)。 GameObject
class 有一个函数叫做 load()
.
因此,在一种情况下,我调用存储在 vector
中的 GameObject
实例的 load()
。此函数将另一个 GameObject
推到 vector
的后面。这会导致 vector
到 运行 内存不足并重新分配。(或调整大小)。现在,对 push_back
returns 的调用,load()
无法再访问任何 GameObject
实例的成员。该实例仍然存在于同一个向量上。
为什么函数无法访问成员? load
看到的成员包含 junk/incorrect 值。有什么解释吗?
vector
不会魔法。它必须通过使用它们的移动构造函数(如果可能)或复制构造函数来移动元素,然后销毁先前位置的旧对象。
因此,在您的情况下,将针对您调用 GameObject::load
的对象调用 GameObject::~GameObject
。当然,在 其他地方 有另一个逻辑上相同的对象,但是当 load
returns 时你的 this
指针无效。 vector
无法在通话进行时更新您的 this
指针。