Плавающее исключение, ошибка сегментации

У меня есть проблема с памятью в моей программе. Я начал отлаживать ее.
Что я узнаю, это:
После проверки 1 у меня ошибка: плавающее исключение (ядро Dumbed)
на 5 в czynnikipierwsze, ошибка сегментации
за 10 номер
и bad_alloc при раскомментировании последней части кода.
Любые идеи, которые могут быть возможной причиной этого (с вектором р = ….)

#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;

}

Я был бы признателен, если бы вы могли мне помочь.

2

Решение

Ошибка 1

Ваш конструктор выполняет выделение памяти следующим образом:

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

Это поместит результат в локальная переменная названный tab, не член поля с тем же именем. Затем ваш конструктор делает все с этой локальной переменной, и поле члена никогда не инициализируется.

Поэтому ваш CzynnikiPierwsze выполняется с неинициализированным указателем и вызывает неопределенное поведение, как только оно обращается к нему. Чтобы усугубить ваши проблемы, вы даже пытаетесь освободить этот никогда не инициализированный указатель в конце этой функции.

Ошибка 2

Кроме того, есть еще одна ошибка в вашем закомментированном коде. После инициализации ваш массив будет содержать 0 0 2 3 2 5 2 7 2 3 2, CzynnikiPierwsze функция при вызове с 5 будет первым push_back tab[5] который 5, Следовательно, m сразу становится 1 и вектор возвращается. Обратите внимание, что только один push_back был выполнен.

Затем вы пытаетесь (в коде, который вы закомментировали), чтобы получить p[0]это нормально и p[1], который не существует и, опять же, вызывает неопределенное поведение — или исключение, если вам повезет.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]