首页 > 解决方案 > 为什么我的对象的属性是“无法读取内存”

问题描述

我正在开发一个用于矩阵对象和操作的 C++ 项目。为此,我设计了一个DoubleMatrix具有三个属性的类:行数、列数和矩阵数据本身。我班级的头文件如下:

#ifndef DOUBLE_MATRIX_H
#define DOUBLE_MATRIX_H
#include <functional>

class DoubleMatrix final
{
    double** mMatrixData;
    int mRows;
    int mColumns;
    typedef std::function<void(int&, int&, double&)> matrixElem;
public:

    DoubleMatrix(int rows, int cols);
    ~DoubleMatrix();

    inline double& get(int& m, int& n) const ;
    inline void set(int m, int n, double value) const;
    DoubleMatrix transpose() const;
    void print() const
    void forEachRowNColumn(const std::function<void(int&, int&, double&)>& block) const;
};
#endif

我不确定是否double** mMatrixData是保存矩阵数据的最佳选择,但我认为效果很好。

源文件如下所示:

#include "DoubleMatrix.h"
#include <iostream> 

DoubleMatrix::DoubleMatrix(const int rows, const int cols)
{
    mRows = rows;
    mColumns = cols;
    mMatrixData = new double*[mRows];
    for (int i = 0; i < mRows; i++)
        mMatrixData[i] = new double[mColumns];  

    for (int i = 0; i < mRows; i++)
        for (int j = 0; j < mColumns; j++)
            mMatrixData[i][j] = 0.0;
}   

DoubleMatrix::~DoubleMatrix()
{
    delete[] mMatrixData;
}   

inline double& DoubleMatrix::get(int& m, int& n) const
{
    return mMatrixData[m][n];
}   

inline void DoubleMatrix::set(const int m, const int n, const double value) const
{
    mMatrixData[m][n] = value;
}   

DoubleMatrix DoubleMatrix::transpose() const
{
    DoubleMatrix transpose = DoubleMatrix(this->mColumns, this->mRows);
    forEachRowNColumn([&transpose](const int r, const int c, const double value)
    {
        transpose.set(c, r, value);
    });
    return transpose;
}   

void DoubleMatrix::print() const
{
    for (int i = 0; i < mRows; ++i)
    {
        for (int j = 0; j < mColumns; ++j)
        {
            std::cout << this->get(i, j) << "\t";
        }
        std::cout << std::endl;
    }
    std::cout << std::endl;
}

void DoubleMatrix::forEachRowNColumn(const matrixElem& block) const
{
    int r = 0;
    int c = 0;
    while (r < mRows)
    {
        while (c < mColumns)
        {
            block(r, c, mMatrixData[r][c]);
            c++;
        }
        r++;
        c = 0;
    }
}

在我的构造函数上,我double**用零初始化。

问题在于必须返回新DoubleMatrix实例的方法,例如transpose(). 当我为此方法返回分配一个变量时,数据是“无法读取内存”。像这样,例如:

#include <iostream>
#include "DoubleMatrix.h"

int main()
{
    DoubleMatrix b = DoubleMatrix(2, 1);
    b.set(0, 0, 1);
    b.set(1, 0, 10);
    std::cout << "\nMatrix B\n";
    b.print();
    std::cout << "\nMatrix B transposed\n";
    DoubleMatrix c = b.transpose();
    c.print(); // ERROR

    std::cin.get();
    return 0;
}

这是调用 main 时出现的错误。 运行 main() 函数时的错误对话框。

如果我单击 break 并尝试访问矩阵的数据,Locals 窗口会显示消息“”:

我也是根据这个问题做的,建议在哪里按值传递返回值,正是我正在做的transpose()方法。

为什么这不起作用?

PS:我接受增强此代码的建议,这是我第一个使用 OO C++ 的项目,此代码是我的 kotlin 库GitHub 链接的 C++ 版本。

标签: c++arraysvisual-studioclassoop

解决方案


推荐阅读