我最近写了一个程序来帮助我理解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 << ", ";
}
}
};
当然,递归性质可能是主要的罪魁祸首,因为您可能正在运行调试版本,所以隐藏了初始化问题。练习是将递归形式转换为迭代形式。