gpt4 book ai didi

c++ - 移动 vector 结构

转载 作者:行者123 更新时间:2023-11-30 01:16:36 25 4
gpt4 key购买 nike

我现在花了太多时间试图让下面的代码不出现段错误。有人可以解释我为什么这样做吗?

我知道问题出在某处未初始化的内存中。

#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 时,这有可能使指向 vector 元素的现有指针/迭代器无效。如果 vector 需要超出其当前内存分配,就会发生这种情况 - 分配新的内存块,复制 vector 内容,并释放旧内存。

这意味着在某些时候 existing_node 变得无效,并且在此之后,取消引用它(通过 existing_node.parents.push_back)会导致崩溃。

有几种方法可以解决这个问题:

  1. 修改 vector 时不要保留对 vector 元素的引用 - 通过其索引直接引用元素(即 nodedb[0].parents.push_back)。

  2. 正如上面@Neil Kirk 所建议的,如果事先知道 vector 的大小,在添加项目之前调用 vector.reserve 意味着 vector 不需要重新分配随着内存的增长。除了解决眼前的问题,这还会提高你的表现。但是,在更改 vector 时保留对 vector 项的引用仍然不是真正的好做法。

  3. 如@Greg Hewgill 所述,您可以更改为使用 list 而不是 vector,因为列表具有现有迭代器/引用的属性列表元素不会因列表更改而失效(除非这些元素本身已被删除)。

关于c++ - 移动 vector 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26290487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com