浮动异常,分段故障
Floating exception, segmention fault
我的程序中有一些内存相关的问题。我开始调试它。我发现: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]
,它不存在,再次导致未定义的行为-或者如果您幸运的话,会出现异常。
相关文章:
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 在C++中,当指向删除和指向不同对象时,分段故障指针
- 分段故障说明
- 分段故障(核心转储)-不知道为什么
- 分段故障线程
- hiredis SET遇到分段故障
- 分段故障,合并排序算法
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 到达主C++之前分段故障
- 分段故障核心使用 IF流转储
- 使用向量的移动键盘排列(分段故障)
- 在二进制树插入和遍历期间,我得到了分段故障
- 分段故障在类之间返回整数
- C++分段故障BST