运行时错误(SIGSEGV)

runtime error (SIGSEGV) in SPOJ

本文关键字:SIGSEGV 运行时错误      更新时间:2023-10-16

我正在解决这个基于质数生成的简单问题。在Xcode中它运行成功。但是当我把解决方案提交给SPOJ时,它说runtime error SIGSEGV。我在互联网上搜索了这个运行时错误,当我检查我的解决方案时,我没有看到任何问题。所以如果有任何问题在我的代码是什么,它是如何解决的?

#include <iostream>
#include <list>
using std::cout;
using std::cin;
using std::endl;
int main() {
   int tcases = 0;
   cin >> tcases;
   const int ccase = tcases;
   tcases = 0;
   while (tcases != ccase) {
     int m = 0, n = 0;
     cin >> m >> n;
     std::list<int> p;
     int i = 0;
     if (m == 1) i = ++m;
     if (m > 1) i = m;
     for (; i <= n; p.push_back(i), ++i);
     // get all the elements
     for (auto first = p.begin(), last = p.end(); first != last; ++first) {
         if (*first == 2) continue;
         else if (*first == 3) continue;
         else if (*first == 5) continue;
         else if (*first == 7) continue;
         else if (*first % 2 == 0) p.erase(first);
         else if (*first % 3 == 0) p.erase(first);
         else if (*first % 5 == 0) p.erase(first);
         else if (*first % 7 == 0) p.erase(first);
     }
     for (auto &elem: p)
         cout << elem << endl;
     cout << endl;
     ++tcases;
    } 
   return 0;
 }

问题是当你说

p.erase(first);

Erase删除当前元素并返回列表中下一个元素的迭代器,该元素没有存储在代码中的任何地方。你在for循环中增加first,所以当下一次循环运行时,first is not pointing to a valid location and hence the runtime error.

for loop更改为以下

for (auto first = p.begin(), last = p.end(); first != last;) {
            if (*first == 2)
            {
                first++;
                continue;
            }
            else if (*first == 3)
            {
                first++;
                continue;
            }
            else if (*first == 5) 
            {
                first++;
                continue;
            }
            else if (*first == 7) 
            {
                first++;
                continue;
            }
            else if (*first % 2 == 0) 
                first = p.erase(first);
            else if (*first % 3 == 0) 
            first = p.erase(first);
            else if (*first % 5 == 0) 
            first = p.erase(first);
            else if (*first % 7 == 0)
                first = p.erase(first);
            else
                first++;
        }

注::共享代码只是为了展示如何使用erase。