【问题标题】:segmentation fault when erasing an object from a vector c++从向量c ++中擦除对象时出现分段错误
【发布时间】:2011-10-01 02:08:03
【问题描述】:
所以我在运行这个函数时出现了段错误
class vector <Record<value> >::iterator itr = records.begin();
for (; itr != records.end(); ++itr) {
if (itr->isSelected()) {
itr = records.erase(itr);
recordSize--;
}
}
我的向量是vector <Record <value> > records;,而函数isSelected() 只是一个boolean,当对象被选中时为真,否则为假。
谁能帮帮我,我不认为这样做有问题
【问题讨论】:
标签:
c++
segmentation-fault
【解决方案1】:
如果您要删除最后一个元素,itr 将首先是 records.end(),因为这是 records.erase() 将返回的内容,然后您将使用 ++itr 递增它。试试:
while (itr != records.end()) {
if (itr->isSelected()) {
itr = records.erase(itr);
recordSize--;
} else {
++itr;
}
}
【解决方案3】:
如果itr 在循环体中没有被修改,或者如果它被递减,for (; itr != records.end(); ++itr) 保证不会转义容器并调用 UB。
您正在推进迭代器:itr = records.erase(itr);。
当你这样做时,你不仅会跳过一个元素,而且你可能会跳过一个过去的假想“元素”,IOW 你可以增加过去一个过去的元素强>(UB)。