代码之家  ›  专栏  ›  技术社区  ›  user3402584

浮动异常,分段错误

  •  2
  • user3402584  · 技术社区  · 12 年前

    我的程序中有一些与内存有关的问题。我开始调试它。 我发现的是: 检查1后,我出现错误:浮点异常(核心哑) 对于czynnikiperwsze中的5个,分段断层 对于10个数字 取消注释代码的最后一部分时使用bad_alloc。 任何想法,这可能是什么原因(向量p=….)

    #include <iostream>
    #include <cctype>
    #include <vector>
    
    
    using namespace std;
    vector<int> CzynnikiPierwsze(int);
    
    
    class NieprawidlowaDana                           //wyjatki
        {};
    class SpozaZakresu
        {};
    
    
    
    class RozkladLiczby{
        private:
            int *tab;
        public:
            RozkladLiczby(int);                  //konstruktor
            vector<int> CzynnikiPierwsze(int); //metoda
            ~RozkladLiczby();                  //destruktor
    };  
    
    
    /////////////////BODY of the CLASS/////////////////////////////////////
    
    
    RozkladLiczby::~RozkladLiczby()         //destruktor
    {}
    
    RozkladLiczby::RozkladLiczby(int n){
        int* tab = new int[n+1];
        int i,j;
    
        for( i=0;i<=n;i++)
            tab[i]=0;                  //zerujemy tablice
    
        for( i=2;i<=n;i+=2)
            tab[i]=2;                  //zajmujemy sie liczbami parzystymi
    
        for(i=3; i<=n;i+=2)
            for(j=i;j<=n;j+=i)         //sito erastotesa
                if(tab[j]==0)
                    tab[j]=i;
    
    
        for(int i=0;i<=10;i++)
            cout<<tab[i]<<endl;         
    
    }
    
       vector<int> RozkladLiczby::CzynnikiPierwsze(int m){
            vector<int> tablica;
            while(m!=1){
                tablica.push_back(tab[m]);
                m=m/tab[m];
            }
        delete [] tab;
    
    return tablica;
    
    }
    
    
    
    
    //////////////////GLOWNY BLOK///////////////////////////////////////
    
    int main(){
        RozkladLiczby odp = RozkladLiczby(10);
        cout<<"CHECK1"<<endl;
    
     vector<int> p = odp.CzynnikiPierwsze(5);
    
        //for(int i=0;i<=1;i++)
        //  cout<< p[i] <<endl;
    
    
    
    return 0;
    
    }
    

    如果你能帮助我,我将不胜感激。

    1 回复  |  直到 12 年前
        1
  •  2
  •   danielschemmel    12 年前

    错误1

    您的构造函数执行如下内存分配:

    int* tab = new int[n+1];
    

    这会将结果放入 局部变量 已命名 tab ,不是同名的成员字段。然后,构造函数使用此局部变量执行所有操作,并且成员字段永远不会初始化。

    因此,您的 CzynnikiPierwsze 是用未初始化的指针执行的,它一访问它就会导致未定义的行为。为了解决问题,您甚至可以尝试在函数末尾释放这个从未初始化的指针。

    错误2

    此外,在注释掉的代码中还有一个错误。初始化后,阵列将包含 0 0 2 3 2 5 2 7 2 3 2 这个 捷克共和国 函数调用时 5 将首先 push_back tab[5] 这是 5. 因此 m 立即变成 1 并返回向量。注意,只有一个 push_back 执行。

    然后(在注释掉的代码中)尝试 p[0] ,这是正常的,并且 p[1] ,这是不存在的,并且会再次导致未定义的行为,如果幸运的话,这是一个例外。