[c++] 为什么我得到错误“向量迭代器不兼容”?



Answers

Question

我正在为我的程序写一个小型的用户界面。 我有onMouseMotion()方法,我可以用两种方法之一调用(参见代码); 如果我通过std::function调用它,那么在for循环停止条件中的!=运算符会产生vector iterators incompatible的运行时异常vector iterators incompatible 。 为什么?

class Widget : public EventHandler
{
protected:
    /* ... */
    std::vector<Widget *> children_;                        
    std::function<bool(Event &)> func_;

private:
    bool onMouseMotion(Event &event);
    /* ... */   
};

Widget::Widget() 
{
    /* ... */
    func_ = std::bind(&Widget::onMouseMotion, this, std::placeholders::_1);
    /* ... */
}

bool Widget::processEvent(Event &event)
{
    if (event.getType() == ui::EventType::MouseMotionEvent) {

        /* Method 1 - onMouseMotion works ok */     
        onMouseMotion(event);

        /* Method 2 - onMouseMotion throws */
        //func_(event);

        return true;
    }
}

bool Widget::onMouseMotion(Event &event)
{
    /* exception occurs on the next line, only when using Method 2 above */
    for (auto child = children_.rbegin(); child != children_.rend(); ++child) {}
}

更新

  • 程序是单线程的。
  • 进入for循环时抛出异常,发生零次迭代。
  • 用MSVC编译。
  • 与空的for循环相同的异常。
  • 重写示例来说明std::function问题。





Links