2016-08-16 268 views
0

我想我有孤立的崩溃只发生在cygwin平台上。试图在Linux上运行valgrind - 没有效果,它报告没有内存错误。我有函数从Polynomes在C++崩溃std :: map

typedef map<multiset<int>, double> Polynome; 

void removeZeroes(Polynome&p){ 
    for(auto it=p.cbegin();it!=p.cend();){ 
     if(p[it->first]==0.) { 
      p.erase(it++); 
     } else ++it; 
    } 
} 

void calcGDerivatives(Reduced &r) { 
    auto vars = getAllVars(r); 
    cout<<"calculating derivatives"<<endl; 
    iterate(vars, [&r](multiset<int>k1)->void { 
     if (r.grandDerivatives.count(k1)) return; 
     Polynome der = r.grandDerivatives[k1]; 
     for (auto &kv : r.grandPoly) { 
      Monome monDer = monomeDeriv(kv.first, k1); 
        multiset<int> p = kv.first; 
      if (monDer.first == 0) continue; 
        monDer.first *= kv.second; 
        add(der, monDer); 
      } 
     removeZeroes(der); 
     r.grandDerivatives[k1]=der; //since der is a copy 
    }); 
} 

删除零个monomes如果我更换Polynome德引用&德和删除r.gr .. [K1] =德,然后我得到一个崩溃。修改std :: map的值是不安全的吗?如何找到发生问题的地方?感谢名单!

+0

你能澄清究竟是什么改变导致它崩溃?我不清楚你在最后一句中所说的变化。 Offhand,你的'removeZeroes'函数*看起来好,所以问题可能在其他地方。 –

+0

r.grandDerivatives [k1]'的返回类型是什么? – NathanOliver

+0

你想使用'if(it-> second == 0)',而不是再次执行另一个地图查找。 –

回答

0

我终于找到问题的真正原因。我的其中一个功能如下所示:

stl::vector<...> f(){ 
    // do something 
    // forgot return 
} 
f(); 

这会立即导致cygwin崩溃。