以下代码在发布模式下有效,并且仅在调试模式下在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;
答案 0 :(得分:2)
向量本质上是数组的包装。给定的数组具有特定的大小,向量的数据存储为该数组的前n个元素,其中 n 是向量的大小,并且数组的大小大于或等于 n 。当您调用push_back
时,向量在其内部数组中没有足够的空间时,它将创建一个更大的新数组(通常是现在大小不足的数组的两倍),并将所有vectors元素复制到该数组中。删除旧数组(这些数组存储在堆中并通过new
和delete
创建之前)。
迭代器本质上是指向此内部数组的指针¹。这样,当您调用push_back时,所有当前的迭代器都可能无效。这是因为可能已经创建了新数组,并且指向旧数组的指针引用了现在释放的内存。从技术上讲,当您调用push_back然后取消引用在该调用之前创建的迭代器时,它就是undefined behavior。
1:从技术上讲,它们是指向内部数组的指针的类包装器,但是原理却是相反的。将它们视为指针通常是但并非总是有用的。