Ваш конструктор Set(T*,int)
не выделяет память new[]
для group
, на которую указывает, что означает, что operator+=
(и ~Set()
, и operator=
) потерпят неудачу во время выполнения, когда они попытаются delete[]
память, на которую указывает group
, которая в вашем примере является локальной стековой памятью, которая принадлежит main()
и передает ее объектам j
и l
.
Ваш конструктор Set(T*,int)
должен new[]
массив group
и скопируйте в него содержимое массива input gro
, аналогично тому, как это делает ваш конструктор копирования, например:
template <class T>
Set<T>::Set(T* gro, int size) : group(NULL), size_group(0)
{
size_group = size;
group = new T[size];
for (int i = 0; i < size; i++) {
group[i] = gro[i];
}
}
Кстати, ваше operator=
вызывает утечку памяти, так как не delete[]
текущий массив group
перед назначением нового массива group
. Он должен создавать временный массив, аналогично тому, как это делает ваш operator+=
, например:
template <class T>
Set<T>& Set<T>::operator=(const Set<T>& obj)
{
if (this != &obj){
T* Temp = new T[obj.size_group];
for (int i = 0; i < obj.size_group; i++)
Temp[i] = obj.group[i];
delete [] group;
group = Temp;
size_group = obj.size_group;
}
return *this;
}
Или лучше, используйте вместо этого свой конструктор копирования через идиому копирования-подкачки :
template <class T>
Set<T>& Set<T>::operator=(const Set<T>& obj)
{
if (this != &obj){
Set<T> temp(obj);
std::swap(group, temp.group);
std::swap(size_group, temp.size_group);
}
return *this;
}
Кроме того, ваш operator+
реализован неправильно. Ему нужно вернуть новый Set
, который является объединением массивов *this
и obj
, а не изменять obj
или *this
вообще. Таким образом, вместо этого он должен выглядеть примерно так:
template <class T>
Set<T> Set<T>::operator+(const Set<T>& obj) const
{
Set<T> res(*this);
for (int i = 0; i < obj.size_group; i++) {
res += obj.group[i];
}
return res;
}