我有以下代码:
iterator = u.U.begin(); //u.U is a map<bitset,long>
int sizeofIterator = u.U.size();
for ( int pp = 0; pp<sizeofIterator; pp++ ){
double *faux = new double[q];
for (int k = 0 ; k<q ; k++){
faux[k]=1;
}
for (int k=0; k<q ; k++){
for (int i=0; i<I ; i++){
faux[k]= faux[k]*successProbability(theta[k],a[i],b[i],c[i]);
}
faux[k] = faux[k]*nodeWeight[k];
}
double sum = 0;
for (int k=0; k<q ; k++){
sum += faux[k];
}
for (int k=0; k<q; k++){
faux[k] = faux[k]/sum;
faux[k] = iterator->second * faux[k];
f[k] = faux[k]+f[k];
for(int i = 0; i<I; i++){
if(iterator->first[i]){
double aux = faux[k];
r[k*I+i]=r[k*I+i]+aux;
}
}
}
iterator++;
}
运行该代码时,我遇到了分段错误。我得到了一些结论,我知道这个问题已经出现了
iterator++;
提示: 当我在线上评论时: [R [K * I + 1] = R [K * I + I] + AUX;
即。我把以下内容 [R [K * I + 1] = R [K * I + I] 0; // +辅助;
¿你知道为什么吗?你能帮我吗?
提前致谢
编辑:我们无法在较少的代码上复制错误,它只是有效,但不是我们想要的代码:(
答案 0 :(得分:0)
提示:当我对行中的aux进行注释时:r [k * I + i] = r [k * I + i] + aux;
即。我把以下r [k * I + i] = r [k * I + i] +0; // + aux;所有的作品(但我 当然需要执行这笔钱!)
这称为巫毒调试,也与您无法生成较小的示例有关。 基本上,您在某些时候已经损坏了堆栈或堆(或两者)。 有时在腐蚀这些之后,你可以继续,但其他功能调用是脆弱的。 您的错误不在地图或迭代器中。 没有理由相信错误甚至在这个函数中。
这会导致虚假和误导性错误(在网络上调查巫毒调查以了解更多信息)。 我推荐像valgrind这样的内存工具,这可能会有所帮助。
另外,另一个apporach可能是将完整的地图遍历循环放入单行语句中,并看看你的结构在哪个时候变得无效,因为上面你在使用它时发现它是无效的,但它可能是暂时无效。
请注意,在上面的代码中,你没有给我们,如果代码太大,会破坏代码,而你没有告诉我们nodeWeight,theta或F。
顺便说一句,如果我不得不打赌堆栈与堆损坏,我会打赌堆栈。在等式中添加额外的术语(根据你的提示)创建并销毁临时对象,这通常是一个堆叠的东西。因此,如果这样做会产生影响,那么它们往往是在错误的地方或类似的地方创建的。答案 1 :(得分:0)
已解决:错误在行
f[k] = faux[k]+f[k];
因为f矢量未初始化。
感谢所有人!