gpt4 book ai didi

c++ - push_back() 期间 vector 迭代器不可取消引用错误

转载 作者:行者123 更新时间:2023-11-28 01:20:54 31 4
gpt4 key购买 nike

下面的代码在 Release模式下工作,并且仅在 Debug模式下在 g_ItemList.push_back() 引发错误,我浏览了一些 SO 帖子和论坛。有人提到 "You can't iterate through a vector while pushing back, as push_back may invalidate iterators" .但这对我来说还不清楚。有人可以解释它背后的逻辑以及如何解决这个问题吗?我正在使用 Visual Studio 2010 (v100) 编译程序

std::vector<class PPart> VECT_ITEMS;    
VECT_ITEMS g_ItemList;
g_ItemList.clear();

for (i = 0; i < n; i++)
g_ItemList.push_back (temp[i]); //where PPart *temp;

错误信息 enter image description here

最佳答案

vector 本质上是数组的包装器。给定的数组具有特定的大小, vector 的数据存储为该数组的前 n 个元素,其中 n 是 vector 的大小,数组的大小大于或等于n。当您调用 push_back 并且 vector 在其内部数组中没有足够的空间时,它会创建一个更大的新 vector (通常是现在大小不足的数组的两倍)并复制所有 vector 在删除旧数组之前将元素放入该数组(这些数组存储在堆中并通过 newdelete 创建)。

迭代器本质上是指向这个内部数组的指针¹。因此,当您调用 push_back 时,所有当前迭代器都可能失效。这是因为可能已经创建了一个新数组,指向旧数组的指针指向现在释放的内存。从技术上讲,当您调用 push_back 然后取消引用在该调用之前创建的迭代器时,它是 undefined behavior .

1:从技术上讲,它们是指向内部数组的指针的类包装器,但原则上是两种方式。将它们仅视为指针通常是有用的,但并非总是如此。

关于c++ - push_back() 期间 vector 迭代器不可取消引用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56318234/

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