[英]c++ Iterator crashing while iterating over vector
我有一个Iformat类,它具有虚函数operator(),每个派生类均实现此功能。
class myClass
{
std::vector<IFormat*> formatList_;
public:
void formatAll()
{
foreach(IFormat* format , formatList_)
{
(*format)();
}
}
};
在myClass
的对象上调用formatAll
函数,然后在循环中, operator()
函数删除此myClass
对象本身,该对象本身调用了formatAll()
函数,由于迭代器损坏,该函数导致崩溃。
约束 :否则无法声明operator()
定义,否则将返回错误类型。
另外,不能使用某些指标变量来跳出循环。
有人可以建议一些处理循环的方法,以免仅通过更改循环和迭代器并遵循约束条件而不会崩溃的情况。 谢谢
是的,有时由于回调产生了一系列复杂的操作,这个问题可能会浮出水面。
您有几种选择:
复制formatList_
中的formatAll
并遍历副本; 您只是在复制指针,但是如果容器很大,或者如果您在某个地方的紧密循环中运行它,这仍然可能是不可取的;
在事件驱动的框架中,您可以将(*format)()
的执行推迟到下一个应用程序“ tick”的开始,在此循环中仅将其添加到某些工作队列中; 这实际上是相同的选项#1,只是很多更复杂的,但如果你有这样一个框架,它可以真的很好槽;
确保以某种方式回调不能直接或间接修改formatList_
; 您可以通过禁止“添加”或“删除”选项或强制推迟使用这些选项来实现。
选项3是“最干净的”方法,但是同样,除非您处于事件驱动的框架中,否则实现起来可能很笨拙。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.