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

314
19 декабря 2016, 19:58

Пишу класс для работы с матричной алгеброй. Матрица может быть произвольного размера, поэтому память выделяю в конструкторе (а в деструкторе уничтожаю).
Переопределил оператор +. Возникает проблема при возврате объекта из функции-оператора: деструктор срабатывает раньше, чем вызывающая программа успеет прочитать данные из объекта. Если деструктор убрать - все работает, но память уплывает.
Что я сделал не так? Спасибо.

Вот код:

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;
}

};

Answer 1

Вам нужен правильный конструктор копирования.

Без него работает автоматически сгенерированный конструктор, который просто копирует указатель на элементы (items) из одной матрицы в другую. В результате, когда исходная матрица уничтожается, данные в скопированной матрице становятся недоступны.

Да, и если уж пишете на C++, переходите с malloc/free на new[]/delete[].

READ ALSO
Пример открытия сокета

Пример открытия сокета

Добрый день, можете мне привести в качестве примера листинг кода c++, чтобы открывался сокет к сайту "examplecom" по порту 716, допустим

308
Как на Си передать информацию от микроконтроллера на COM- порт?

Как на Си передать информацию от микроконтроллера на COM- порт?

Добрый вечерЗанимаюсь изучением программирования микроконтроллеров АВР, и столкнулся с вопросом передачи данных от микроконтроллера на ПК через...

370
Расстояние между строками. Qt QPainter::drawText

Расстояние между строками. Qt QPainter::drawText

Здравствуйте! Вывожу текст на печать через QPainter::drawTextПодскажите как можно изменить интервал между строками

437
Компиляция программы

Компиляция программы

Есть исходник программы управления устройством через USB (микроконтроллер Attiny45)

316