有时会出现分段错误(核心转储)

时间:2014-11-29 17:03:12

标签: c++ segmentation-fault

我的程序有时会运行正常,但有时它会在运行中出现分段错误时崩溃。每次运行程序时,故障都会在不同的时间发生。我用gdb调试,发现问题出在这个函数中

int chooseLink(int &h, vector<Edge> &link) {
    double r = 1.0*rand() / RAND_MAX;

    if (link[link[h].l_ID].q == link[link[h].r_ID].q) {     // this is where the error occurs
        if (r<0.5)
            return link[h].l_ID;

        return link[h].r_ID;
    }
    else {

        if (r < link[link[h].l_ID].q / (link[link[h].l_ID].q + link[link[h].r_ID].q)) 
            return link[h].l_ID;

        return link[h].r_ID;
    }
}

我的程序涉及数百万次调用此函数。任何人都可以建议问题可能是什么?我很确定矢量“链接”不会超出其容量。这是我第一次发布问题,很抱歉,如果我没有提供足够的信息

更新

有人问我为什么通过参考传递h。我认为通过引用传递比传递值更好,因为它节省了空间并且程序运行得更快。那不对吗?

有人要求边缘课,所以这里是

class Edge {

public:
    int ID;             // ID of edge
    bool type;        // true for constant, false for variable
    double q;                    // quantity on the edge
    int l_ID = 0;           // ID of left edge (equals 0 if doesn't exist)     
    int r_ID = 0;           // ID of right edge

    void assignType(double &p) {
        if (p == 0.5)
            type = false;
        else
            type = true;
    }
};

我在函数中添加了一个try-catch块,所以看起来像这样:

int chooseLink(int &h, vector<Edge> &link) {

    try {
         if (h<0 || h>=link.size() ) {
             throw h;
         }
    } catch(...) {
       cout << "ERROR: h = " << h << endl;
    }

    double r = 1.0*rand() / RAND_MAX;

    if (link[link[h].l_ID].q == link[link[h].r_ID].q) {     // this is where the error occurs
        if (r<0.5)
            return link[h].l_ID;

        return link[h].r_ID;
    }
    else {

        if (r < link[link[h].l_ID].q / (link[link[h].l_ID].q + link[link[h].r_ID].q)) 
            return link[h].l_ID;

        return link[h].r_ID;
    }
}

现在我根本没有得到分段错误。此外,程序运行良好,没有抛出异常。这是怎么回事?当我删除这个try-catch块时,我再次得到段错误。我不明白

1 个答案:

答案 0 :(得分:0)

第一个建议总是边界或范围检查您的参数:

int chooseLink(int h, vector<Edge> &link)
{
    const unsigned int container_size = link.size();
    // Check index for range.
    if ((h < 0) || (h >= container.size)
    {
       // Report error here.
    }
    else
    {
       // More checking.
       const int left_id = link[h].l_ID;
       const int right_id = link[h].r_ID;
       if ((left_id < 0) || (left_id >= container.size))
       {
          // Perform error handling
       }
       if ((right_id < 0) || (right_id >= container_size))
       {
          // Perform error handling
       }

       // remember to use 'const' for items that won't change.
       const double r = 1.0*rand() / RAND_MAX;

    if (link[left_id].q == link[right_id].q)
    {
        // ALWAYS use braces, even for single statements.
        if (r<0.5)
        {
            return left_id;
        }
        return right_id;
    }
    else
    {

        if (r < link[left_id].q / (link[left_id].q + link[right_id].q))
        {
            return left_id;
        }
        return right_id;
    }
// What does it return here?
}
}  

如有疑问,请检查您的变量。

此外,检查您的逻辑,以便所有执行路径返回一个值。