我有时会遇到这种类型的错误。我的问题是,有没有办法找出有关何时何地(哪一行)确实发生此错误的信息?我在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;
}
答案 0 :(得分:1)
我想在firstVector
和secondVector
上的迭代存在问题。在第二个循环中:
auto it = firstVector.begin();
for (; ; ++it)
{
it
是firstVector
的迭代器。但是在下一个循环中:
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