У меня есть программа, которая использует класс для динамического выделения массива. Я перегрузил операторов, которые выполняют операции над объектами этого класса.C++: Ошибка выполнения при использовании перегруженных операторов присваивания соединений
Когда я тестирую эту программу, перегруженный + = работает, но - = не работает. Авария программы при попытке запустить перегруженный - = и я получаю следующее сообщение об ошибке во время выполнения:
malloc: * error for object 0x7fd388500000: pointer being freed was not >allocated * set a breakpoint in malloc_error_break to debug
В частных переменных членах, я объявляю массив как это:
double* array_d;
Я динамически выделить массив в перегруженном конструкторе:
Students::Students(int classLists)
{
classL = classLists;
array_d = new double[classL];
}
у меня есть следующие две перегруженные конструкторы, определенные как друзья класса студентов:
friend Student operator+= (const Student&, const Student&);
friend Student operator-= (const Student&, const Student&);
Они определяются следующим образом:
Student operator+= (const Student& stu1, const Student& stu2)
{
if (stu1.getClassL() >= stu2.getClassL())
{
for (int count = 0; count < stu.getClassL(); count++)
stu1.array_d[count] += stu2.array_d[count];
return (stu1);
}
else if (stu1.getClassL() < stu2.getClassL())
{
for (int count = 0; count < stu1.getClassL(); count++)
stu1.array_d[count] += stu2.array_d[count];
return (stu1);
}
}
Student operator-= (const Student& stu1, const Student& stu2)
{
if (stu1.getClassL() >= stu2.getClassL())
{
for (int count = 0; count < stu2.getClassL(); count++)
stu1.array_d[count] -= stu2.array_d[count];
return (stu1);
}
else if (stu1.getClassL() < stu2.getClassL())
{
for (int count = 0; count < stu1.getClassL(); count++)
stu1.array_d[count] -= stu2.array_d[count];
return (stu1);
}
}
В основном то, что происходит здесь, я сравниваю два объекта с массивами, которые различаются по размеру на основе classL. функция getClassL()
просто: int Student::getClassL() const {return classLists;}
В случае, если вам интересно, я перегружен большой тройки таким образом:
1. Destructor:Student::~Student() {delete [] array_d;}
2. Конструктор копирования:
Student::Student(const Student &student)
{
classLists = student.classLists;
array_d = student.array_d;
}
3. Оператор присваивания:
Student &Student::operator=(const Student &student)
{
classLists = student.classLists;
array_d = student.array_d;
}
Это странно, что + = работает, но - = не работает, так как они практически одинаковы. Я подозреваю, что моя проблема заключается в распределении моей динамической памяти, но я не уверен и ищу совет.
'operator + =' и '- =' должен возвращать ссылки на текущий объект, а не на новый объект. Таким образом, ваш код, который принимает два объекта 'Student' для' + = 'и' - = ', не имеет особого смысла. Эти функции должны брать один объект «Студент» по ссылке и добавлять его в 'this' и возвращать' * this'. Теперь, если бы они были оператором '+' и '-', то две функции аргументов имели бы немного больше смысла. – PaulMcKenzie
Неправильный конструктор копирования. Вам нужно выделить массив правильного размера и скопировать элементы. Ваше задание также неверно. См. Это: http: //stackoverflow.com/questions/4172722/what-is-the-rule-of-three – NathanOliver
Поскольку вы копируете адрес массива в своем конструкторе копирования, возникает следующая проблема: пусть A, B - студенты, вы копируете B в A, B в какой-то момент уничтожается, а его массив удаляется в деструкторе, но A по-прежнему содержит указатель на эту ячейку памяти. Это можно решить, следуя советам @ NathanOliver. –