C ++中动态内存分配的运行时错误

时间:2014-03-17 16:19:27

标签: c++

我是OOP概念的新手,在尝试解决Project Euler Problem 7时,为了找到第1000个素数,我尝试使用类来做,但遇到了2个主要错误。

  1. 实例化课程prime_n
  2. 初始化其论点
  3. 我已将代码发布在此处供参考:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    class prime_n
    {
         int j,k;
         int n;
         int *store;
    
         public:
         prime_n(int num)
         {
             n=num;
             store[n];
         }   
         static int isPrime(int j)
         {
              for(int i=2;i*i<=j;i++)
              {
                   if(j%i==0) return 0;
              }
              return 1;
         }
         void find_n()
         {
              for(int i=0;i<n;i++)
              {
                   store[i]=0;
              }
              store[0]=2;
              j=3;
              k=1;
              while(store[n-1]==0)
              {
                   if(isPrime(j)) store[k++]=j;
                   j+=2;
              }
         }
         int get_num()
         {
         int value=store[n-1];
         return value;
         }   
    };   
    
    int main()
    {
         int num, req_num;
         printf("Enter the position at which prime number is to be found ");
         scanf("%d",&num);
         printf("\nnumber = %d",num);
    
         prime_n p = new prime_n(num);
    
         req_num = p.get_num();
         printf("The required prime number is %d\n",req_num);
         return 0;
    }
    

    如果有人能帮助我找出实际出错的地方,那将是一个很大的帮助。非常感谢提前!

2 个答案:

答案 0 :(得分:2)

使用

prime_n p(num);

或(在这种特殊情况下不推荐)

prime_n * p = new prime_n(num);
// some other code
req_num = p->get_num(); // note the -> operator replacing . in case of pointers

delete p;

第一种情况在堆栈上声明p,当程序离开作用域时会自动解除分配(在这种情况下为main函数)

第二个在堆上分配空间,p是指向它的指针。您必须手动释放内存。

至于你的第二个问题,C ++的方式是

#include <iostream>

...
int num;
std::cout << "Enter the position at which prime number is to be found "
std::cin >> num;
std::cout << std::endl << "Number = " << num << std::endl;

答案 1 :(得分:1)

您提供了一个构造函数:

 prime_n(int num)
 {
     n=num;
     store[n];
 }   

我认为你的印象是store[n]创建了一个包含n个元素的数组,但事实并非如此;它试图访问数组的第(n + 1)个元素。由于商店没有指向任何地方(毕竟我们在构造函数中),程序崩溃了。

您可能希望改为编写store = new int[num]

然后我看不到来自get_num()的find_n()调用是在main()中调用的,所以你的程序现在只返回一个随机值。