При передаче по значению (например, в функцию swap) будет вызван ваш конструктор копирования. Поскольку вы не определили конструктор копирования, для вас будет создан конструктор по умолчанию. Этот конструктор копирования просто скопирует значение указателя array
, что означает, что у вас будет 2 экземпляра, указывающих на одну и ту же динамически распределенную память. Когда оба этих деструктора запустятся, он дважды освободит память, что приведет к неопределенному поведению, которое будет отображаться как ошибка, которую вы видите.
Вы в основном нарушаете правило 0/3/5
Простым решением было бы сделать массив std::unique_ptr<T[]>
, который будет вызывать ошибки сборки, пока вы не исправите свою проблему.