浮点异常,分段错误和类似错误

时间:2016-12-23 16:49:12

标签: c++ debugging core

我有时会遇到这种类型的错误。我的问题是,有没有办法找出有关何时何地(哪一行)确实发生此错误的信息?我在ubuntu linux 14.04上。使用sublime和g ++。

这是我目前的代码。我在这里得到一个浮点异常。它需要2个向量并打印可被第一组的每个元素整除的数字,并且可以划分第二组的每个元素。

发布代码有点无关紧要,但它迫使我找到一种合适的方法来调试上面提到的错误类型。这是我第一次在这里问一个问题,对我很轻松。

 int main()
{
    vector<int> firstVector;
vector<int> secondVector;
firstVector = {2,4};
secondVector = {16,32,96};
auto it = firstVector.begin();
for (int i = 1; i <= 100; ++i)
{
   it = firstVector.begin();
    for (; ; ++it)
    {
        if(i%(*it)!=0)
            break;
        if(it==firstVector.end())
        {
            it=secondVector.begin();
            while(it!=secondVector.end())
            {
                if((*it)%i!=0)
                {
                    it=firstVector.begin();
                    break;
                }
                it++;
            }
        }
        if(it==secondVector.end())
            break;
    }
    if(it==secondVector.end())
        cout << i << endl;
}
return 0;
}

2 个答案:

答案 0 :(得分:1)

我想在firstVectorsecondVector上的迭代存在问题。在第二个循环中:

 auto it = firstVector.begin();
 for (; ; ++it)
 {

itfirstVector的迭代器。但是在下一个循环中:

 it=secondVector.begin();
 while(it!=secondVector.end())
 {

it成为secondVector的迭代器。在此it循环之后,在for循环中继续while上的迭代。您可以在++it元素之后和之后递增if(i%(*it)!=0)并访问元素.end()。这会导致UB

  

此元素充当占位符;尝试访问它会导致未定义的行为。

答案 1 :(得分:0)

这个问题有两个部分。自尼基塔已经解决了你的代码......

  

我的问题是,有没有办法找出有关何时何地(哪一行)确实发生此错误的信息?

使用gdb name-of-executable在Linux上进行调试。简单地run并且程序将在发生seg故障时中断,或者我相信会抛出致命异常。它会告诉你文件名和行号。

您还可以查找更多gdb命令,例如:http://www.yolinux.com/TUTORIALS/GDB-Commands.html