Я думаю, что у меня есть изолированная авария, которая происходит только на платформе 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!
Можете ли вы точно определить, какое изменение заставляет его сбой? Я не знаю, какие изменения вы говорите в последнем предложении. Offhand, ваша функция 'removeZeroes' * кажется * ok, поэтому проблема, вероятно, в другом месте. –
Каков тип возврата 'r.grandDerivatives [k1]'? – NathanOliver
Вы хотите использовать 'if (it-> second == 0)' и не выполнять другой поиск карты снова. –