Я использую мелкое копирование, чтобы скопировать один объект в другой, и когда 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;
}
Ваш код вызывает неопределенное поведение. Когда ваш код вызывает неопределенное поведение, может произойти все что угодно. Вы не должны ожидать каких-либо конкретных симптомов, таких как сбой или отсутствие сбоя.
Ваш код вызывает неопределенное поведение из-за этого раздела:
array = new int[0];
this->num=n;
for ( int i=0; i<n; i++)
array[i]=i;
когда n > 0
Записываешь за пределы выделенного пространства.
Одна вопиющая проблема заключается в том, что ваш 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 чтобы убедиться, что копирование объекта не приводит к повреждению памяти.