2016-08-16 3 views
0

Cygwin 플랫폼에서만 발생하는 충돌을 고립 시켰다고 생각합니다. 리눅스에서 valgrind로 실행하려고했는데 아무런 효과가 없었습니다. 아무런 메모리 오류도보고하지 않았습니다. I는 & DER를 참조하고 r.gr을 제거 Polynome 데르 바꾸면 I는 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

정확히 어떤 변경으로 인해 충돌이 발생하는지 명확하게 설명 할 수 있습니까? 나는 당신이 마지막 문장에서 어떤 변화를 이야기하고 있는지 분명하지 않습니다. Offhand, 당신의'removeZeroes' 함수 *는 * ok * 같다. 그래서 문제는 아마 다른 곳에서있을 것이다. –

+0

'r.grandDerivatives [k1]'의 반환 유형은 무엇입니까? – NathanOliver

+0

'if (it-> second == 0)'를 사용하고 다른 맵 검색을 다시하지 않을 것입니다. –

답변

0

마침내 문제의 진정한 원인을 발견했습니다. 내 기능 중 하나는 다음과 같습니다.

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

이것은 cygwin에서 즉시 충돌을 일으 킵니다.