从向量 c++ 中删除对象时出现分段错误
因此,当我运行此函数时,我会出现段错误,
class vector <Record<value> >::iterator itr = records.begin();
for (; itr != records.end(); ++itr) {
if (itr->isSelected()) {
itr = records.erase(itr);
recordSize--;
}
}
其中我的向量为 vector
函数 isSelected()
只是一个 boolean
,当对象被选择时,它的值为 true;当对象未被选择时,它的值为 false。
有人可以帮助我吗,我不认为这样做有什么问题
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您要删除最后一个元素,
itr
首先将是records.end()
,因为这就是records.erase()
将返回,然后您使用 ++itr 递增它。尝试:In the case where you're deleting the last element,
itr
will first berecords.end()
because that's whatrecords.erase()
will return, and then you're incrementing it with++itr
. Try:您不应该像这样删除向量元素,这不是一种有效的方法,因为您可能会在此过程中多次重新分配向量。
正确且更有效的方法是使用 std::erase 函数。请参阅此问题的示例。
You shouldn't be erasing vector elements like that, it is not an efficient method as you may cause the reallocation of the vector several times during the process.
The correct and more efficient way of doing this is to use the std::erase function. See this question for examples.
如果
itr
在主体中没有被修改,则for (; itr !=records.end(); ++itr)
保证不会转义容器并调用 UB循环,或者如果它被递减。在这里,您正在推进迭代器:
itr = Records.erase(itr);
。当你这样做时,你不仅会跳过一个元素,还可能会跳过最后一位假想的“元素”,你可以递增超过最后一位(布)。
for (; itr != records.end(); ++itr)
is guaranteed not to escape the container and invoke UB ifitr
is not modified in the body of the loop, or if it is decremented.Here you are advancing the iterator:
itr = records.erase(itr);
.When you do so, no only you are skipping an element, also you may skip the one-past-the-end imaginary "element", IOW you may increment past one-past-the-end (UB).