浮动异常,分段故障

Floating exception, segmention fault

本文关键字:分段 故障 异常      更新时间:2023-10-16

我的程序中有一些内存相关的问题。我开始调试它。我发现:check1后,我有错误:浮动异常(核心Dumbed)对于5分之一的zynnikipierwsze,分段故障对于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

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

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

这将把结果放在一个名为tab局部变量中,而不是同名的成员字段。然后构造函数用这个局部变量做所有的事情,成员字段永远不会初始化。

因此,您的CzynnikiPierwsze使用未初始化的指针执行,并且一旦访问它就会导致未定义的行为。使问题复杂化的是,你甚至试图在函数末尾释放这个从未初始化的指针。

错误2

另外,在注释掉的代码中还有另一个错误。初始化后,你的数组将包含0 0 2 3 2 5 2 7 2 3 2。当5调用CzynnikiPierwsze函数时,首先是push_back tab[5],即5。因此,m立即变成1,返回向量。注意,只执行了一个push_back

然后尝试(在您注释掉的代码中)获得p[0],这是ok的和p[1],它不存在,再次导致未定义的行为-或者如果您幸运的话,会出现异常。