向量的移动结构
Moving structs of vectors
我现在花了太多时间试图让下面的代码段不出错。有人能解释一下为什么会这样吗?
我知道这个问题存在于某个未初始化的内存中。
#include <iostream>
#include <vector>
using namespace std;
struct node {
vector<int> parents;
};
int main() {
vector<node> nodedb;
{
node df;
nodedb.push_back(move(df));
}
{
node &existing_node = nodedb[0];
for (int i = 0; i < 100; ++i) {
node df;
nodedb.push_back(move(df));
existing_node.parents.push_back(0);
}
}
return 0;
}
当您在循环中调用nodedb.push_back
时,这可能会使指向向量元素的现有指针/迭代器失效。如果矢量需要增长到当前内存分配之外,就会发生这种情况——分配一个新的内存块,复制矢量内容,释放旧内存。
这意味着existing_node
在某个时刻变得无效,在此之后,(通过existing_node.parents.push_back
)取消引用它会导致崩溃。
有几种方法可以解决这个问题:
-
在修改向量时,不要保留对向量元素的引用——直接通过其索引(即
nodedb[0].parents.push_back
)引用该元素。 -
正如@Neil Kirk在上面所建议的,如果向量的大小是预先知道的,那么在添加项目之前调用
vector.reserve
意味着向量在增长时不需要重新分配内存。除了解决眼前的问题,这也将提高你的表现。然而,在更改矢量的同时保留对矢量项的引用仍然不是一种很好的做法。 -
正如@Greg Hewgill所指出的,您可以更改为使用
list
而不是vector
,因为列表具有这样的属性,即对列表元素的现有迭代器/引用不会因列表的更改而无效(除非这些元素本身被删除)。
相关文章:
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- MSVC将仅移动结构参数解释为指针
- 设计将引用元素移动到开头的数据结构.C++
- 在 c++ 中将数据从未对齐结构数组移动到对齐结构数组
- 在继承层次结构中复制和移动
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 为什么结构化绑定禁用RVO和移动返回语句
- 如何使用 spirit x3 将解析的结果移动到结构中
- 如何使用结构在 2d 数组中移动玩家对象
- C++将unique_ptr移动到结构成员
- C++:从动态结构数组中删除元素并移动其他元素
- 移动指针是否经过结构成员 UB?并访问它?
- 在对结构数组的一个成员进行排序后,移动其成员的其余部分
- 自定义分配器上的额外移动结构用于叮当声
- 移动一个结构数组C++
- 在OpenGL中移动一个简单的形状(形状在数据结构中)
- 复制/移动结构到另一个结构
- 将C代码和结构初始化和分配移动到C 编译器
- 如何移动内部有承诺的结构
- 向包含POD和非POD成员的现有结构添加移动语义