2016-08-16 7 views
0

Ich denke, ich habe Absturz isoliert, die nur auf Cygwin-Plattform passiert. Versucht, mit Valgrind auf Linux zu laufen - keine Wirkung, meldet keine Speicherfehler. Ich habe Funktion Null Monomes von PolynomeAbsturz in 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 
    }); 
} 

entfernen Wenn ich Polynome der ersetzen & der referenzieren und r.gr entfernen .. [k1] = der, dann habe ich einen Absturz zu bekommen. Ist es unsicher, den Wert von std. :: map zu ändern? Wie kann ich einen Ort finden, an dem ein Problem auftritt? Danke!

+0

Können Sie genau klären, welche Änderung es zum Absturz bringt? Ich bin unklar, über welche Veränderungen Sie im letzten Satz sprechen. Offenbar scheint Ihre 'removeZeroes'-Funktion * ok zu sein, so dass das Problem wahrscheinlich woanders ist. –

+0

Was ist der Rückgabetyp von 'r.grandDerivatives [k1]'? – NathanOliver

+0

Sie möchten 'if (it-> second == 0)' verwenden und keine weitere Map-Suche erneut durchführen. –

Antwort

0

Ich habe endlich die wahre Ursache des Problems gefunden. Eine meiner Funktionen sah so aus:

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

Dies führt sofort zu einem Absturz auf Cygwin.