Как мне освободить память в Matrix Class?

У меня есть класс матрицы и со следующим конструктором:

template<class T>
Matrix<T>::Matrix(unsigned rows, unsigned cols) :
rows(rows), cols(cols) {
index = 0;
data_ = new T[rows * cols];
}

template<class T>
Matrix<T>::~Matrix() {
delete[] data_;
}

Когда я вычисляю обратную матрицу, я хотел бы освободить память
временная переменная называется a:

template<class T>
Matrix<T> Matrix<T>::inverse() {
unsigned i, j, k;
Matrix<T> a(2 * rows, 2 * rows);
....
return tmp;
}

Я думал, что эта переменная будет уничтожена в конце функции, но когда я проверяю:

for (int i = 0; i < 3; i++) {
Matrix<double> m(5, 5);
m << 5, 2, 4, 5, 6, 1, 3, 1, 2, 5, 2, 5, 2, 7, 2, 9, 2, 1, 0.1, 0.43, 1, 0, 0, 0, 1;
m.inverse();
std::cout << m << std::endl;
}

В первом цикле a инициализируется нулями, но на следующем шаге начальные значения a это предыдущие значения, так a(k+1)=a_endvalues(k), Почему это так?

0

Решение

Проблема в том, что вы не инициализируете элементы вашего динамически размещенного массива в конструкторе. Чтобы убедиться, что массив имеет созданные по умолчанию элементы или элементы с нулевой инициализацией, вы должны сделать это в своем конструкторе:

template<class T>
Matrix<T>::Matrix(unsigned rows, unsigned cols) :
rows(rows), cols(cols) {
index = 0;
data_ = new T[rows * cols]();
//             ^ HERE!
}

Но, как было отмечено в комментариях, вы могли бы сделать вашу жизнь проще, используя std::vector<T>:

template<class T>
Matrix<T>::Matrix(unsigned rows, unsigned cols) :
rows(rows), cols(cols), data_(rows*cols)
{ }
2

Другие решения

Память действительно свободна. И затем снова выделяется в следующей итерации цикла. Не то чтобы ваш Matrix Конструктор не инициализирует массив ни к чему, поэтому он просто содержит то, что, как оказалось, было сохранено в памяти, которая теперь принадлежит ему.

Возможно, что в вашем конкретном случае распределитель помещает вторую итерацию a.data_ в том же месте, где первая итерация a.data_ был, так что вы все еще видите старые ценности.

3

Память освобождается и перераспределяется каждый раз, когда вызывается функция. Перекрытие ценностей — это просто случайность. Новое распределение может быть в том же месте, что и старое. Вы можете проверить это, создав другой параметризованный конструктор и передав отдельный инициализатор.

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

2

Инициализация массива — это отдельная вещь от его выделения.

Добавьте выходные данные отладки в свой деструктор, чтобы убедиться, что он вызывается.

Также, чтобы инициализировать массив нулем, возможно, используйте memset:

memset(a, 0, rows * cols * sizeof(T));
1

Локальная переменная ‘a’ уничтожается, и деструктор освобождает память. Однако, когда память была распределена снова, это просто случайно, что ячейка памяти имеет предыдущее содержимое.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector