2016-01-28 113 views
0

所以我寫了這一點: Matrix.h:0000005:訪問衝突讀取位置0xFDFDFDED

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

它崩潰的無效矩陣:: SETM(... )當我嘗試刪除M [i]爲i = 1;它爲我= 0完美的罰款;但後來崩潰,我沒有一個合理的解釋,爲什麼它會這樣做。我可以看到調試器顯示內存在它實際崩潰之前無法讀取,但我不明白如何修復它。提前致謝!

+0

我的猜測是get_m返回不同的值。無論如何請使用std :: vector – pm100

+1

如果您看到0xfdfdfdfd,您的內存覆蓋了某處。 http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations –

+1

你的'矩陣'缺少一個賦值操作符。此外,大部分代碼都可以用一個簡單的'std :: vector >'代替。最後,向我們展示練習此課程的「主」程序。 – PaulMcKenzie

回答

0

您刪除的基礎上m值的陣列之前設置你的m和最終使用的m值刪除舊的陣列。你應該先刪除你的數組,然後設置m m,然後創建你的新數組。

+0

是啊,我很笨。對!對不起,愚蠢的錯誤;( – AVI