List 还有一个map/set迭代器不可递增,但这次是';s C++;11

List 还有一个map/set迭代器不可递增,但这次是';s C++;11,list,visual-studio-2012,c++11,map,iterator,List,Visual Studio 2012,C++11,Map,Iterator,这是我宝贵的一小段代码,它让我的VC++2012不寒而栗,而如果我在Mac上运行相同的代码,似乎根本没有问题 for(auto trace : _traces) { std::list<tuio::Cursor> cursors = trace.second.cursors; std::vector<Vec2f> v; for(tuio::Cursor p : cursors) { v.push_back(p.getPos());

这是我宝贵的一小段代码,它让我的VC++2012不寒而栗,而如果我在Mac上运行相同的代码,似乎根本没有问题

for(auto trace : _traces) {
    std::list<tuio::Cursor> cursors = trace.second.cursors;

    std::vector<Vec2f> v;
    for(tuio::Cursor p : cursors) {
        v.push_back(p.getPos());
    }
    if(v.size() > 2) {
        BSpline2f l(v, min((int)v.size()-1, 3), false, true);
        PolyLine2f pl;
        for(int i = 0; i < v.size(); i++) {
            float t = (float)i/(float)v.size();
            pl.push_back((l.getPosition(t)*s)+o);
        }
        gl::draw(pl);
    }


    tuio::Cursor c = cursors.back();
    gl::drawSolidCircle((c.getPos()*s)+o , _scale * 10.0f);
}
请注意注释,如果问题是这个主线程和绘图线程之间的某种奇怪的交叉运行,那么您需要用硬棒打我。在这一点上,让您知道我正在使用libCinder可能很重要,但我对其内部知之甚少,因此我只能推测应用程序和绘图运行在不同的线程中。无论如何

回溯在第一行为标识了
,当然异常是由
std::_Tree\u const\u iterator
引发的,我怀疑我对此一无所知,Jon Snow。
auto
东西似乎工作正常,或者至少VS告诉我,所以我认为
foreach
构造有问题,并用显式迭代器等重写了它

我错了。接下来,我将auto更改为它们的显式类型,但没有更好的结果。不完全是这样,因为在某个时候我遇到了一个不同的异常,关于列表迭代器不兼容的问题,这就是为什么我扔掉了autos并硬编码了实际的类型

虽然在这一点上,我有效地使用了普通的旧C++03技术,但其余的代码仍在VS 2012之前编译为C++11,这在处理尖端技术时并不可靠(事实上,我上次检查时,也就是六个多月前,它甚至不支持基于范围的for循环)


任何想法都值得赞赏。

如果您在(自动跟踪:\u跟踪){
的循环中从
\u跟踪
中删除光标,如果您在(自动跟踪:\u跟踪)的循环中从
\u跟踪
中删除光标,则循环迭代器将失效{,循环迭代器将失效

没有宝贵的代码,您需要在运行代码之前编译代码;),因此,您可能没有精确地表述您的问题,而仅仅是咆哮。您可能正在使用来自临时对象的迭代器。您调试过吗?哪一行正在崩溃?谁说我没有编译它?我每次按F5都会损失三十秒的生命!:)因此,我也没有咆哮。我向您保证,如果我咆哮,您将我看不到一行代码;)现在,关于你评论的严重部分,这是有点可能的,但据我所能证实,我没有。我正在复制所有东西,就我所能确定的而言(这不是很多,但仍然是)。当然,不编译就运行它是相当困难的:)。循环呢(请参阅下面的答案)。如果有多个线程同时访问
\u跟踪
,并且其中至少一个线程调用了非常量方法(尤其是
操作符[]
std::map
上是非常量的,则可能是在迭代时修改了映射。)这是一场数据竞赛:未定义的行为。你将度过一段糟糕的时光。没有宝贵的代码,你需要在运行之前编译代码;),因此,您可能没有精确地表述您的问题,而仅仅是咆哮。您可能正在使用来自临时对象的迭代器。您调试过吗?哪一行正在崩溃?谁说我没有编译它?我每次按F5都会损失三十秒的生命!:)因此,我也没有咆哮。我向您保证,如果我咆哮,您将我看不到一行代码;)现在,关于你评论的严重部分,这是有点可能的,但据我所能证实,我没有。我正在复制所有东西,就我所能确定的而言(这不是很多,但仍然是)。当然,不编译就运行它是相当困难的:)。循环呢(请参阅下面的答案)。如果有多个线程同时访问
\u跟踪
,并且其中至少一个线程调用了非常量方法(尤其是
操作符[]
std::map
上是非常量的,则可能是在迭代时修改了映射。)这是一场数据竞赛:未定义的行为。你会过得很糟糕。是的,这完全有可能。事实上,我注释掉了第二个代码片段中的擦除操作,并且在相当长的一段时间内我都没有遇到崩溃。一种可行的方法可能是在TouchTrace中有一个isVisible成员,将其设置为false以防止其崩溃正在绘制(图纸代码的修改待定),并在短时间延迟后将其擦除。这里有一个类似的问题:是的,这是完全可能的。事实上,我注释掉了第二个代码片段中的擦除操作,并且在相当长的一段时间内没有出现崩溃。可行的方法可能是在TouchTrace中有一个isVisible成员,将其设置为false到prev将其从绘图中删除(绘图代码的修改待定),并在短暂延迟后将其删除。下面是一个类似问题:
void TheApp::cursorRemoved(tuio::Cursor cursor) {
    _traces[cursor.getSessionId()].addCursorUp(cursor);
    _traces.erase(cursor.getSessionId());
    // Well, that was abrupt.
}