c ++迭代器在向量上迭代时崩溃

时间:2014-01-06 15:52:07

标签: c++ boost stl

我有一个 Iformat 类,它有虚函数operator(),每个派生类都实现了这个函数。

class myClass
{
    std::vector<IFormat*> formatList_;
public:
  void formatAll()
  {
    foreach(IFormat* format , formatList_)
    {
        (*format)();
    }
  }

};

formatAll的对象上调用myClass函数,然后在循环中,operator()函数正在删除此myClass对象本身,该对象调用了{{1}因为迭代器被破坏而导致崩溃的函数。

约束formatAll()定义无法声明,否则返回错误类型。
此外,不能使用一些指标变量来打破循环。

有人可以建议处理循环的方法,以便只通过更改循环和迭代器并遵循约束就不会崩溃。 感谢

1 个答案:

答案 0 :(得分:0)

是的,有时由于回调引起的复杂操作链,这个问题可能会出现。

您有几个选择:

  1. 复制formatList_内的formatAll并重复复制;你只是复制指针,但如果容器很大,或者你在某个地方以紧密的方式运行它,这可能仍然是不受欢迎的;

  2. 在事件驱动的框架中,您可以将(*format)()的执行推迟到下一个应用程序“tick”的开始,在此循环中仅将其添加到某个工作队列中;这实际上与选项#1相同,只是更复杂,但如果你有这样一个框架,它可以很好地插入;

  3. 以某种方式确保回调不能直接或间接地修改formatList_;您可以通过禁止“添加”或“删除”选项,或强制推迟那些来实现此目的。

  4. “最干净”的方法是选项#3,但是,除非您处于事件驱动的框架中,否则实施起来可能很笨拙。