#операторы #перегрузка_операторов #cpp
Пишу класс для работы с матричной алгеброй. Матрица может быть произвольного размера,
поэтому память выделяю в конструкторе (а в деструкторе уничтожаю).
Переопределил оператор +. Возникает проблема при возврате объекта из функции-оператора:
деструктор срабатывает раньше, чем вызывающая программа успеет прочитать данные из
объекта. Если деструктор убрать - все работает, но память уплывает.
Что я сделал не так? Спасибо.
Вот код:
class Matrice{
float ** items;
float & v(uint8_t i, uint8_t j){
return *(float *)(items + i * w + j);
}
public:
int h, w;
Matrice(uint8_t height, uint8_t width){
h = width;
w = width;
items = (float **)malloc(h * w * sizeof(float));
}
~Matrice(){
free((void *)items);
}
float * operator[](uint8_t i){
return (float *)(items + i * w);
}
const Matrice operator +(Matrice M){
Matrice A(M.h, M.w);
for (int i = 0; i < h; i++){
for (int j = 0; j < w; j++){
A[i][j] = v(i, j) + M[i][j];
}
}
return A;
}
};
Ответы
Ответ 1
Вам нужен правильный конструктор копирования. Без него работает автоматически сгенерированный конструктор, который просто копирует указатель на элементы (items) из одной матрицы в другую. В результате, когда исходная матрица уничтожается, данные в скопированной матрице становятся недоступны. Да, и если уж пишете на C++, переходите с malloc/free на new[]/delete[].
Комментариев нет:
Отправить комментарий