ошибка двойного или свободного искажения, когда я проверяю 10 как размер массива

Я беспокоюсь об этой ошибке. Насколько я прочитал о новых / удалить ошибки, но я не уверен, почему это просто происходит.

Ну, вот мой базовый класс «algoritmo»:

class algoritmo{
protected:
int* vector_;
int n_;
public:
algoritmo();
algoritmo(int);
~algoritmo();
void mostrar();
virtual void ordenar(int,int,int)=0;};

И вот один из ее детей «qsort»:

class quicksort : public algoritmo{
public:
quicksort():algoritmo(){}
quicksort(int j):algoritmo(j){}
~quicksort();
void ordenar(int,int,int);
};

И я делаю это на main.cpp:

#include <vector>
using namespace std;
int main(void){
vector<algoritmo*> metodos;
int tamvector;
cout << "Size of the vector" << endl;
cin >> tamvector;
metodos.push_back(new quicksort(tamvector));
metodos[0]->mostrar();
metodos[0]->ordenar(0,tamvector,0);
cout << "I did";
metodos[0]->mostrar();
cout << "I didn't access a wrong pos" << endl;
cout << metodos.empty();
return 0;
}

Я не знаю почему, но если я введу размер 9,45,20,11,3 оно работает отлично но когда я ввожу размер 10 я получил numap или же двойная свобода или коррупция.

Может кто-нибудь объяснить мне, почему?

Спасибо за внимание.

Обновление: информация о классах по запросу

`**Algoritmo definition**

algoritmo::algoritmo(){
n_=0;
vector_=new int[n_];
}

algoritmo::algoritmo(int tamano){
n_=tamano;
vector_=new int[n_];
srand(time(NULL));
for(int i=0;i<n_;i++){
vector_[i]=rand()%9000+1000;
}
}

algoritmo::~algoritmo(){
delete vector_;
n_=-1;
}

void algoritmo::mostrar(){
for(int i=0;i<n_;i++){
cout << vector_[i] << " ";
}
cout << endl;
}`

И определение быстрой сортировки

`quicksort::~quicksort(){}
void quicksort::ordenar(int ini,int fin,int relleno1){
int i,f,p,x;
i=ini;
f=fin;
p=vector_[(i+f)/2];
while(i < f){
while(vector_[i]<p)
i++;
while(vector_[f]>p)
f--;
if(i<=f){
x=vector_[i];
vector_[i]=vector_[f];
vector_[f]=x;
i++;
f--;
}
}
if(ini <f)
ordenar(ini,f,relleno1);
if(i < fin)
ordenar(i,fin,relleno1);
}`

0

Решение

Ваш класс управляет динамически размещенным массивом, но не следует правило трех тем, что вы не предоставили конструктор копирования или оператор присваивания, который позаботится о создании копий управляемых ресурсов, где это применимо. Поэтому, когда вы копируете или присваиваете, вы получаете более одного экземпляра, указывающего на один и тот же динамически размещенный массив. Все они пытаются позвонить delete на это в конце их жизни, давая вам ошибку двойного освобождения.

Вы можете легко это исправить, используя std::vector<int> в качестве члена данных вместо использования необработанного указателя на динамически размещенный массив.

Заметка: могут быть и другие ошибки, но именно эта является источником неопределенное поведение и должно быть исправлено.

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector