0xC0000005:访问违规读取位置0xFDFDFDED

0xC0000005: Access violation reading location 0xFDFDFDED

本文关键字:读取 位置 0xFDFDFDED 访问 0xC0000005      更新时间:2023-10-16

所以我写了这个:矩阵:

#pragma once
class Matrix
{
private:
int m, n;
double** M = nullptr;

public:
Matrix();
Matrix(int,int);
Matrix(const Matrix&);
~Matrix();
void set_m(int);
void set_n(int);
int get_m() const;
int get_n() const;
void setM(double**,int,int);
double** getM() const;
void show();
Matrix operator*(Matrix&) const;
};

矩阵.cpp:

#include "Matrix.h"
#include<iostream>
using namespace std;
/*
*/
Matrix::Matrix()
{
set_n(1);
set_m(1);
delete[] M;
M = new double*[get_m()];
for (int i = 0; i < m; i++) {
    M[i] = new double[get_n()];
}
for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++) M[i][j] = 1.0;
}
Matrix::Matrix(int m_,int n_)
{
set_n(n_);
set_m(m_);
delete[] M;
M = new double *[get_m()];
for (int i = 0; i < m; i++) {
    M[i] = new double[get_n()];
}
for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++) M[i][j] = 1.0;
 }
 Matrix::Matrix(const Matrix& M_)
 {
set_n(M_.get_n());
set_m(M_.get_m());
delete[] M;
M = new double*[get_m()];
for (int i = 0; i < m; i++) {
    M[i] = new double[get_n()];
}
for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++) M[i][j] = M_.getM()[i][j];
}
void Matrix::set_m(int m_) {
if (m_ > 0)
    m = m_;
else
    m = 1;
}
void Matrix::set_n(int n_) {
if (n_ > 0)
    n = n_;
else
    n = 1;
}
double** Matrix::getM() const {
return M;
}
Matrix Matrix::operator*(Matrix &M_) const
{
if (get_n() != M_.get_m()) {
    if (get_m() != M_.get_n()) return Matrix();
    else {
        Matrix T(*this);
        return M_*T;
    }
}
else {
    //n = m
    Matrix R(get_m(), M_.get_n());
    for (int i = 0; i < get_m(); i++) {
        for (int j = 0; j < M_.get_n(); j++) {
            double res = 0;
            for (int k = 0; k < get_n(); k++) {
                res += getM()[i][k] * M_.getM()[k][j];
            }
            R.getM()[i][j] = res;
        }
    }
    return R;
}
}
int Matrix::get_m() const {
return m;
}
int Matrix::get_n() const {
return n;
}
void Matrix::setM(double** M_, int m_, int n_) {
set_m(m_);
set_n(n_);
for (int i = 0; i < get_m(); i++) {
        delete M[i];
}
    delete[] M;
M = new double*[m_];
for (int i = 0; i < m; i++) {
    M[i] = new double[n_];
}
for (int i = 0; i < m_; i++)
    for (int j = 0; j < n_; j++) M[i][j] = M_[i][j];
}
void Matrix::show() {
for (int i = 0; i < get_m(); i++) {
    for (int j = 0; j < get_n(); j++) {
        cout << getM()[i][j]<<" ";
    }
    cout << endl;
}
}
Matrix::~Matrix()
{
for (int i = 0; i < get_m(); i++) {
    delete M[i];
}
delete[] M;
}

当我尝试删除 m [i] 为 i = 1 时,它会在 void Matrix::setM(...) 处崩溃; 对于 i=0 来说它完全没问题; 但后来崩溃了,我没有一个合理的解释为什么它会这样做。我可以看到调试器向我显示即使在实际崩溃之前也无法读取内存,但我不明白如何解决它。提前感谢!

您在根据m删除数组之前设置m,并最终使用m删除旧数组。您应该首先删除数组,然后设置 m m,然后创建新数组。