C++ 中的崩溃 std::map
Crash in C++ std::map
我想我已经隔离了只在 cygwin 平台上发生的崩溃。尝试在 linux 上使用 valgrind 运行 — 没有效果,它没有报告任何内存错误。我有从 Polynomes
中删除零单体的功能
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
});
}
如果我将 Polynome der 替换为引用 &der 并删除 r.gr..[k1]=der,那么我会崩溃。修改std::map的值不安全吗?如果出现问题,我如何找到一个地方?谢谢!
我终于找到问题的真正原因了。我的一个函数如下所示:
stl::vector<...> f(){
// do something
// forgot return
}
f();
这会立即导致 cygwin 崩溃。
我想我已经隔离了只在 cygwin 平台上发生的崩溃。尝试在 linux 上使用 valgrind 运行 — 没有效果,它没有报告任何内存错误。我有从 Polynomes
中删除零单体的功能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
});
}
如果我将 Polynome der 替换为引用 &der 并删除 r.gr..[k1]=der,那么我会崩溃。修改std::map的值不安全吗?如果出现问题,我如何找到一个地方?谢谢!
我终于找到问题的真正原因了。我的一个函数如下所示:
stl::vector<...> f(){
// do something
// forgot return
}
f();
这会立即导致 cygwin 崩溃。