У вас есть несколько проблем, которые приводят к сбою и другим проблемам.
Во-первых, утверждение
v1 = arr1;
эквивалентно
v1 = vector<int>(&arr1[0]);
Этоозначает, что будет создан временный объект vector<int>
, который вызывает конструктор vector(T *a)
.
И здесь начинаются проблемы: поскольку это конструктор, конструируемый объект является неинициализированным , так какцель конструктора - инициализировать его. Это означает, что переменная-член x
будет также неинициализирована и не будет указывать на правильное местоположение.
Вам нужно выделить память и заставить x
указывать на эту память, в противном случаевы разыменовываете неинициализированный указатель, который приводит к неопределенному поведению и очень вероятно к вашему падению.
Что касается других проблем, в первую очередь вы упускаете деструктор, что означает, что выделение памятине нужно нигде быть свободнымЧто в данном случае на самом деле хорошо, потому что у вас нет действительного оператора присваивания (и вы полагаетесь на оператор присваивания, сгенерированный компилятором), копирование в v1 = arr1
будет мелкой копией, которая копирует только сам указатель, а непамять, на которую он указывает.
Проблема поверхностного копирования означает, что некоторое время у вас будет два объекта, элемент x
которых будет указывать на одну и ту же память. И если один объект удаляет эту память (например, когда упомянутый выше временный объект разрушен), то второй указатель в v1
больше не будет действительным.
Это причина правил трехи пять .