调用在函数调用期间重新分配的“std::vector”元素的函数是否会导致麻烦
Does calling functions of an element of an `std::vector` which gets reallocated during the function call cause trouble?
我有一个GameObject
s的std::vector
。我使用指向它们的直接指针访问这些GameObject
。(不用担心指针失效,我会在指针vector
重新实现时更新指针)。GameObject
类有一个名为 load()
的函数。
因此,在一种情况下,我调用存储在vector
中的GameObject
实例的load()
。此功能在vector
的后面推送另一个GameObject
。这会导致vector
内存不足并重新分配。(或调整大小)。现在,对push_back
的调用返回,load()
无法再访问GameObject
实例的任何成员。不过,该实例仍然存在于同一向量上。
为什么函数无法访问成员?load
看到的成员包含垃圾/不正确的值。有什么解释吗?
vector
不会魔法。它必须使用元素的移动构造函数(如果可能)或复制构造函数来移动元素,然后销毁先前位置的旧对象。
因此,在您的情况下,将为您调用的对象调用GameObject::~GameObject
GameObject::load
.当然,其他地方还有另一个逻辑上相同的对象,但是当load
返回时,您的this
指针无效。vector
无法在呼叫过程中更新this
指针。
相关文章:
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 对 Vector 元素 (C++) 的push_back操作
- 从 std::vector 中选择一个元素,而不是给定元素
- 将 Vector<String > 元素复制到其他 Vector<String>* (1 作为
- 有没有更快的方法可以在 std::vector 中插入元素
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- clang C++17 std::vector over align type 使用 -mavx 编译时元素 SIGSE
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 通过引用传递时访问std::vector的元素
- 有没有函数可以直接获取 std::vector 元素的大小?
- 如何非常快速地将数字添加到 Vector 中的一系列元素中
- 如何安全地擦除 std::vector 中的元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>