我最近写了一个程序来帮助我理解C++中的内存指针的基础,我选择了一个简单的质数查找器。

我终于得到它的工作。 (是的,用于调试!)

我让它运行以查看进展情况,它达到了素数#815389,我的冗长告诉我是65076素数,我遇到了应用程序崩溃。我能想到的一件事是我的整数溢出,所以我将它们更改为多头,它卡在同一位置。

有人能够帮助解释造成这种情况的限制吗?

comp:WinVista 64位家庭高级版,6GB ram AMD 4800+ X2
内存使用4,664K时程序崩溃

资源:

#include <cstdlib>

#include <iostream>

\\\\(Backslashes added for readability)

using namespace std;

long number;
long numnum;

class num;

class num {

  public:

         long i;
         void check();
         bool nxt;
         num* nxtnum;
};

void num::check() {

 if (number % i != 0) {
            if (nxt == true) {
                    (*nxtnum).check();
            } else {
                   nxtnum = new num();
                   (*nxtnum).i = number;
                   numnum++;
                   cout << numnum << ":" << number << ", ";
                   nxt = true;
            };
 };
};


int main(long argc, char *argv[]){

  numnum = 1;
  cout << numnum << ":" << 2 << ", ";
  num two;
  two.i = 2;
  for (number = 3; 1<=1000001; number++) {
    two.check();
  };
  cout << endl;
  system("PAUSE");
  return EXIT_SUCCESS;
};

(不要管用户名,它只是我使用的别名,因此我可以通过Google跟踪我的所有帖子)

最佳答案

肖恩是正确的,two.nxt从未初始化。实际上,从未为num的任何实例初始化num.nxt。如果使类更健壮,则成员nxt是不必要的。可以使用nxt指针代替:

class num
{
private:
    long i;
    num *nxtnum;
public:
    num (long value) : i (value), nxtnum (0) { }
    void check ()
    {
      if (number % i != 0)
      {
        if (nxtnum)
        {
          nxtnum->check ();
        }
        else
        {
          nxtnum = new num (number);
          cout << ++numnum << ":" << number << ", ";
        }
     }
};

当然,递归性质可能是主要的罪魁祸首,因为您可能正在运行调试版本,所以隐藏了初始化问题。练习是将递归形式转换为迭代形式。

08-16 12:37