【发布时间】:2021-07-14 07:35:41
【问题描述】:
以下代码产生以下输出,并以 100% cpu 负载的无限循环结束。
#include <iostream>
#include <set>
class Foo{};
void delete_object_from_set(std::set<Foo *>& my_set, Foo* ob)
{
std::set< Foo *>::iterator setIt;
std::cout << "Try to delete object '" << ob << "'..." << std::endl;
for(setIt = my_set.begin(); setIt != my_set.end(); ++setIt)
{
Foo * tmp_ob = *setIt;
std::cout << "Check object '" << tmp_ob << "'..." << std::endl;
// compare the objects
//
if(ob == tmp_ob)
{
// if the objects are equal, delete this object from the set
//
std::cout << "Delete object '" << tmp_ob << " from set..." << std::endl;
setIt = my_set.erase(setIt);
std::cout << "Deleted object '" << tmp_ob << " from set..." << std::endl;
}
}
std::cout << "loop finished." << std::endl;
};
int main()
{
Foo* ob = new Foo();
std::set< Foo * > my_set;
my_set.insert(ob);
delete_object_from_set(my_set, ob);
std::cout << "finished" << std::endl;
return 0;
}
输出:
Try to delete object '0x563811ffce70'...
Check object '0x563811ffce70'...
Delete object '0x563811ffce70 from set...
Deleted object '0x563811ffce70 from set...
所以它没有完成,有 100% 的 cpu 负载。
我知道如何正确执行(见下文),但我不明白这里发生了什么。这不是一个无限循环,从那时起它应该不断地输出一些东西,但它只是一直在做something。知道什么吗?
如何正确操作:Deleting elements from std::set while iterating 和 How to remove elements from an std::set while iterating over it
【问题讨论】:
-
阅读:stackoverflow.com/questions/6438086/iterator-invalidation-rules。一旦使用它使迭代器失效,它就是未定义的行为。
-
您正在为
end迭代器调用++- 未定义的行为。if(ob == tmp_ob) { // ... } else ++setIt;和for(setIt = my_set.begin(); setIt != my_set.end(); ) -
谢谢,但为什么最终会导致 100% cpu 负载并且不再有输出?能说一下cpu一直在做什么吗?
-
也许,发射火箭很可能你的 set 实现中的 operator++() 进入无限循环。如果您使用的是 gcc,您可能能够找到它的源代码(不确定其他编译器)
标签: c++