0xC0000005:访问冲突读取位置0xFDFDFDED

时间:2016-01-28 22:05:21

标签: c++

所以我写了这个: Matrix.h:

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

};

Matrix.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完全没问题;但后来崩溃了,我没有理性的解释为什么会这样做。我可以看到调试器向我显示即使在它实际崩溃之前也无法读取内存,但我不明白如何修复它。提前谢谢!

1 个答案:

答案 0 :(得分:0)

您在根据m值删除阵列之前设置m,并最终使用 new m的值。您应首先删除您的阵列,然后设置m m,然后创建新阵列。