& quot; Двойное освобождение или коррупция & quot; ошибка не выдается при перестановке строк кода

Я использую мелкое копирование, чтобы скопировать один объект в другой, и когда main () выходит из области видимости, вызываются деструкторы и выдается ошибка «: двойное освобождение или повреждение (fasttop):», что прекрасно, так как я использую поверхностное копирование. Теперь, когда я создаю другой объект между двумя копиями, он не выдает никакой ошибки, которая вызывает у меня проблемы.

int main(int argc, char *argv[])
{
int n =5;

vector vec(n);
vector vec1(vec);
cout<<vec<<endl;
cout<<vec1<<endl;

return 0;
}

который дает вывод
Что ожидается, поскольку я использую мелкую копию
Теперь, когда я добавляю еще один объект между ними, то не выдается никакой ошибки

int main(int argc, char *argv[])
{
int n =5;

vector vec(n);
vector vec2(n);
vector vec1(vec);
cout<<vec<<endl;
cout<<vec1<<endl;

return 0;
}

Которые не дают ошибок вывода

-3

Решение

Ваш код вызывает неопределенное поведение. Когда ваш код вызывает неопределенное поведение, может произойти все что угодно. Вы не должны ожидать каких-либо конкретных симптомов, таких как сбой или отсутствие сбоя.

Ваш код вызывает неопределенное поведение из-за этого раздела:

array = new int[0];
this->num=n;
for ( int i=0; i<n; i++)
array[i]=i;

когда n > 0Записываешь за пределы выделенного пространства.

3

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

Одна вопиющая проблема заключается в том, что ваш vector В классе отсутствует пользовательский конструктор копирования. Когда вы делаете это в main:

vector vec1(vec);

Вы делаете поверхностную копию (копируете значения указателя). Вы увидите, что когда деструктор vector называется в конце main для вас обоих vector объекты:

~vector()
{
delete [] array; // <-- Same pointer value being deleted twice
cout<<"Base class Dest"<<endl;
}

Это приводит к delete вызывается на то же array значение дважды, когда main выходы. Это ошибка двойного удаления.

Вам необходимо реализовать определяемый пользователем конструктор копирования и оператор присваивания, чтобы обеспечить надлежащее копирование вашего vector учебный класс. Читайте на правило 3 чтобы убедиться, что копирование объекта не приводит к повреждению памяти.

2

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