- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
Vector_type(const Vector_type& m1) {
if (this->size != m1.size) {
if (this->size != 0)
destroy_memmory();
this->size = m1.size;
this->M = new m_type[size];
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
}
else {
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
}
};
Vector_type& operator = (const Vector_type& m1) {
if (this->size != m1.size)
throw "not right =";
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
return *this;
};
Действительно что могло пойти не так? просто копировать приравнять, копировать, приравнять, копировать...
Вот не знаю,
это вызов конструктора копирования, конструктор по умолчанию + присваивание или implementation-defined?
Vector_type(const Vector_type& m1) {
if (this->size != m1.size) {
if (this->size != 0)
destroy_memmory();
this->size = m1.size;
this->M = new m_type[size];
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
}
else {
for (int i = 0; i < size; i++)
this->M[i] = m1.M[i];
}
};
Vector_type& operator = (const Vector_type& m1) {
if (this->size != m1.size)
"not right =";
*this = Vector_type (m1);
return *this;
}
Просто в чем смысл проверки? Типа, один раз создаем вектор нужного размера, и чтобы дальше случайно не присвоить что-то другого размера?
Необходимо перегрузить оператор присваивания, так чтобы он делал то же самое что и копирования если размеры одинаковые, ну ладно просто сделаем так-наш новый вектор равен копированию... и в итоге мы имеем бесконечное присваивание)
*this = Vector_type (m1);
Стоп. Еще ж и в конструкторе использование неинициализированных полей. Которое проходит только потому, что их содержимое не совпадает с корректным size. В дебаге-то все будет работать, поскольку, как правило, память при выделении заполняется специальным значением, а вот в релизе будет рандомно падать.
Но вечный цикл всё равно создаётся, до тех пор покуда в куче есть память.