【问题标题】:Floating exception, segmention fault浮动异常,分段错误
【发布时间】:2014-03-22 14:28:40
【问题描述】:

我的程序中有一些与内存相关的问题。我开始调试它。 我发现的是: 检查1后我有错误:浮动异常(核心哑巴) 对于 5 在 czynnikipierwsze,分段错误 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;

}

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

【问题讨论】:

    标签: c++ exception segmentation-fault floating


    【解决方案1】:

    错误 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],这没关系,而 p[1],它不存在,并且再次导致未定义的行为 - 如果幸运的话,还会导致异常。

    【讨论】:

      猜你喜欢
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多