#операторы #перегрузка_операторов #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[].
Комментариев нет:
Отправить комментарий