Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Перегрузка математических операторов

#операторы #перегрузка_операторов #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[].

Комментариев нет:

Отправить комментарий