【问题标题】:Segfault on C++ map iterator not out of boundsC ++映射迭代器上的段错误未超出范围
【发布时间】:2013-11-22 03:01:48
【问题描述】:

我有以下代码:

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 次(map 的大小)但在第 18 次迭代时出现段错误

提示: 当我在线评论辅助时: r[k*I+i]=r[k*I+i]+辅助;

即我把以下 r[k*I+i]=r[k*I+i]+0;//+aux;

所有的作品(但我需要执行那个总和,当然!)

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

提前致谢

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

【问题讨论】:

  • 试着把它变成一个简短的完整例子。
  • 你能在每次迭代期间打印出aux 的值吗,这样行吗?
  • 我的猜测是:寻找字段r!我认为段违规发生在那里。原因是,如果您将aux 注释掉,那么循环中不会发生任何事情,并且编译器可能会优化某些内容。此外,可以根据iterator 忽略相应的块。与iterator 有联系。我猜索引超出范围。在使用之前打印k*I+i,并将其与r 的边界进行比较。

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


【解决方案1】:

提示:当我在行中注释 aux 时:r[k*I+i]=r[k*I+i]+aux;

即我把下面的 r[k*I+i]=r[k*I+i]+0;//+aux;所有作品(但我 肯定需要执行那个总和!)

这称为 voodoo 调试,也与您无法生成更小的示例有关。 基本上,您在某些时候损坏了堆栈或堆(或两者)。 有时在破坏这些之后,您可以继续,但其他函数调用很脆弱。 您的错误不在地图或迭代器中。 几乎没有理由相信错误甚至出现在此函数中。

这会导致虚假和误导性错误(在网络上进行 voodoo 调试以了解更多信息)。 我推荐一个像 valgrind 这样的记忆工具,它可能会有所帮助。

否则,另一种方法可能是将完整的地图遍历循环放入单行语句中,并查看您的结构在什么时候变得无效,因为上面您在使用它时发现它无效,但它可能暂时失效了。

注意在上面的代码中,你没有给我们I,如果太大会破坏代码,你没有告诉我们上面的nodeWeight,theta或F。

顺便说一句,如果我必须赌堆栈与堆损坏,我会赌堆栈。向方程添加额外的项(根据您的提示)会创建和破坏临时变量,这通常是堆栈的事情。因此,如果这样做会有所作为,那么它们通常是在错误的地方或类似地方创建的。

【讨论】:

  • 非常感谢,我认为这非常合理,会调查一下。
【解决方案2】:

已解决:错误出现在行中

f[k] = faux[k]+f[k];

因为 f 向量没有初始化。

谢谢大家!

【讨论】:

  • 所以,写给 f 是无效的,但你很不幸,它只是破坏了你的状态,而不是立即崩溃。损坏的状态在不相关的位置具有奇怪的行为和崩溃,并响应代码中看似无关的微小更改。
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2018-01-27
  • 2016-10-16
  • 1970-01-01
相关资源
最近更新 更多