C ++上的Segfault映射迭代器不会超出界限

时间:2013-11-22 03:01:49

标签: c++ map iterator segmentation-fault bitset

我有以下代码:

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++;

迭代器必须迭代32次(映射的大小)但是段错误发生在第18次迭代中

提示: 当我在线上评论时:     [R [K * I + 1] = R [K * I + I] + AUX;

即。我把以下内容     [R [K * I + 1] = R [K * I + I] 0; // +辅助;

一切正常(但我必须执行这笔款项!)

¿你知道为什么吗?你能帮我吗?

提前致谢

编辑:我们无法在较少的代码上复制错误,它只是有效,但不是我们想要的代码:(

2 个答案:

答案 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矢量未初始化。

感谢所有人!