2016-08-16 3 views
0

Я думаю, что у меня есть изолированная авария, которая происходит только на платформе cygwin. Пытался работать с valgrind на linux - никакого эффекта, он не сообщает об ошибках памяти. У меня есть функция, чтобы удалить нулевые monomes из PolynomesCrash 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 
    }); 
} 

Если я заменяю полином дер ссылаться & дер и удалить r.gr .. [k1] = дер, то я получаю аварию. Небезопасно ли изменять значение std :: map? Как я могу найти место, когда проблема возникает? Thanx!

+0

Можете ли вы точно определить, какое изменение заставляет его сбой? Я не знаю, какие изменения вы говорите в последнем предложении. Offhand, ваша функция 'removeZeroes' * кажется * ok, поэтому проблема, вероятно, в другом месте. –

+0

Каков тип возврата 'r.grandDerivatives [k1]'? – NathanOliver

+0

Вы хотите использовать 'if (it-> second == 0)' и не выполнять другой поиск карты снова. –

ответ

0

Я, наконец, нашел истинную причину проблемы. Одна из моих функций выглядела так:

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

Это немедленно дает сбой на cygwin.

 Смежные вопросы

  • Нет связанных вопросов^_^