我有一个 Iformat 类,它有虚函数operator(),每个派生类都实现了这个函数。
class myClass
{
std::vector<IFormat*> formatList_;
public:
void formatAll()
{
foreach(IFormat* format , formatList_)
{
(*format)();
}
}
};
在formatAll
的对象上调用myClass
函数,然后在循环中,operator()
函数正在删除此myClass
对象本身,该对象调用了{{1}因为迭代器被破坏而导致崩溃的函数。
约束:formatAll()
定义无法声明,否则返回错误类型。
此外,不能使用一些指标变量来打破循环。
有人可以建议处理循环的方法,以便只通过更改循环和迭代器并遵循约束就不会崩溃。 感谢
答案 0 :(得分:0)
是的,有时由于回调引起的复杂操作链,这个问题可能会出现。
您有几个选择:
复制formatList_
内的formatAll
并重复复制;你只是复制指针,但如果容器很大,或者你在某个地方以紧密的方式运行它,这可能仍然是不受欢迎的;
在事件驱动的框架中,您可以将(*format)()
的执行推迟到下一个应用程序“tick”的开始,在此循环中仅将其添加到某个工作队列中;这实际上与选项#1相同,只是更复杂,但如果你做有这样一个框架,它可以很好地插入;
以某种方式确保回调不能直接或间接地修改formatList_
;您可以通过禁止“添加”或“删除”选项,或强制推迟那些来实现此目的。
“最干净”的方法是选项#3,但是,除非您处于事件驱动的框架中,否则实施起来可能很笨拙。