gpt4 book ai didi

c++ - Visual C++ 中的 std::vector::erase() 中的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:20 25 4
gpt4 key购买 nike

我在 std::vector 的删除函数中遇到段错误,这让我发疯。我有以下代码:

std::map<uint32_t, std::vector<boost::uuids::uuid> >::iterator it
= theAs.find(lSomeUint32);
if (it != theAs.end()) {
std::vector<boost::uuids::uuid>& lIds = it->second; // vector contains one entry
std::vector<boost::uuids::uuid>::iterator it2 = lIds.begin();
while (it2 != lIds.end()) {
if (*it2 == lSomeUuid) {
lIds.erase(it2);
break;
}
++it2;
}
}

在 lIds.erase(it2) 中,我遇到了段错误。更准确地说,我在从删除调用的 _Orphan_range(可以在 c:\Program Files\Microsoft Visual Studio 10.0\VC\include\vector 中找到)中遇到段错误。但我不知道为什么。 vector 和迭代器看起来没问题。但是在 _Orphan_range 中,出现了完全错误的情况。虽然我的 vector 只包含一项,但其中的 while 循环执行了三次。在第三次运行中,变量 _Pnext 被破坏。

有人有想法吗?那太棒了!

大卫


不幸的是(或者幸运的是),上面的例子是独立运行的。但在我的大型软件项目中,它不起作用。

有人知道执行失败的函数 _Orphan_range 是为了什么吗?

最佳答案

从 std::vector 中删除会使迭代器无效。见STL vector::erase因此 it2 在第一次调用 erase 后无效。唉,检查“(it2 != lIds.end())”不会是真的。

将您的代码更改为:

if (*it2 == lSomeUuid) {
it2 = lIds.erase(it2);
break;
}

关于c++ - Visual C++ 中的 std::vector::erase() 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7516145/

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