2016-08-16 11 views
0

私はcygwinプラットフォームでのみ発生するクラッシュを分離したと思います。 linux上でvalgrindを実行しようとしましたが、何の効果もなく、メモリエラーは報告されません。私は..私は& DERを参照してr.grを削除するにはPolynomeデルを交換する場合PolynomesC++のクラッシュ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を削除する機能を持っている[K1] =デル、その後、私はクラッシュを取得します。 std :: mapの値を変更することは危険ですか?問題が起きた場所を見つけるにはどうすればいいですか?ありがとう!

+0

どのような変更によりクラッシュするのかを明確にすることはできますか?私はあなたが最後の文で何を話しているのか不明です。オフハンドでは、あなたの 'removeZeroes'関数*は* okと思われるので、問題はおそらく他の場所にあります。 –

+0

'r.grandDerivatives [k1]'の戻り値の型は何ですか? – NathanOliver

+0

'if(it-> second == 0)'を使い、もう一度別のマップルックアップを実行しません。 –

答えて

0

私はついにこの問題の真の原因を発見しました。私の関数の1つは次のようになります:

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

これはすぐにcygwinでクラッシュします。

関連する問題