矩阵乘法运算执行中的内存泄漏

Memory leak in the implementation of the matrix multiplication operation

执行矩阵乘法运算时内存泄漏:

template <typename T>
    class Matrix
    {
    private:
        T *data = nullptr;
        size_t rows;
        size_t cols;

这是乘法运算本身:

Matrix<T> operator*(const Matrix<T> &other)
        {
            Matrix<T> result(rows, other.cols);
            if (cols == other.rows)
            {
                for (size_t i = 0; i < rows; i++)
                {
                    for (size_t j = 0; j < other.cols; j++)
                    {
                        for (size_t k = 0; k < cols; k++)
                        {
                            result.data[i * other.cols + j] += data[i * cols + k] * other.data[k * other.cols + j];
                        }
                    }
                }
            }
            else
            {
                throw std::logic_error("Matrix sizes do not match");
            }
            return result;
        }

如何更改此方法以使其正常工作(并且不会落在测试中)?

这里是link到classhttps://godbolt.org/z/4PPYx4Y3j。出于某种原因,这里一切正常,但是当我开始测试时:

TEST(testMatrixCalculations, testMultiplication)
{
    myMatrix::Matrix<int> mat1(3, 3);
    myMatrix::Matrix<int> mat2(3, 3);

    for (auto &it: mat1)
    {
        it = 3;
    }

    for (auto &it : mat2)
    {
        it = 3;
    }
    mat1.printMatrix();
    mat2.printMatrix();

    myMatrix::Matrix<int> mat3 = mat1 * mat2;
    mat3.printMatrix();
    for (auto it : mat3)
    {
        ASSERT_EQ(it, 27);
    }
}

输出这个:

    3 3 3 3 3 3 3 3 3 
    3 3 3 3 3 3 3 3 3 
    -1119477653 32718 -1119477653 32718 775685387 21966 775685387 21966 27 
Failure
    Expected equality of these values:
      it
        Which is: -1119477653
      27

您的 result.data 未初始化为 0,但您对其应用了 += 操作。您必须在 Matrix 主构造函数中将 Matrix::data 成员初始化为零,或者在乘法循环中对其进行初步初始化。

            for (size_t i = 0; i < rows; i++) {

                for (size_t j = 0; j < other.cols; j++) {

                    result.data[i * other.cols + j] = 0;

                    for (size_t k = 0; k < cols; k++) {

                        result.data[i * other.cols + j] += data[i * cols + k] * other.data[k * other.cols + j];
                    }
                }
            }