2016-11-19 63 views
0

我有一個名爲Get的成員函數作爲矩陣類結構的一部分。該矩陣保存圖像每個像素的灰度代碼。這個類聲明的指針私有變量當在數組中返回值時,C++訪問衝突讀取位置

double* matData new double[N*M]; 

每當我打電話Get功能我得到的錯誤:

ACCESS VIOLATION READING LOCATION 

下面是我一起工作的兩個文件:

矩陣。 h

#ifndef MATRIX 
#define MATRIX 


class Matrix { 
public: 
    Matrix(int sizeR, int sizeC, double* input_data, string n); 
    double Get(int i, int j) const; 
    void Set(int i, int j, double val); 
    ~Matrix(); 
private: 
    int M; int N; 
    string name; 
    double* matData; 
}; 


#endif 

Matrix.cpp

#include <iostream> 
#include <string> 

using namespace std; 

#include "matrix.h" 

Matrix::Matrix(int sizeR, int sizeC, double* input_data, string n) 
{ 
    M = sizeR; 
    N = sizeC; 
    name = n; 
    double* matData = new double[N*M]; 

    cout << "New Matrix '" << name << "' created" << endl; 

    for (int ii = 0; ii<M*N; ii++) 
    { 
     *(matData + ii) = *(input_data + ii); 
    } 
} 
Matrix::Get(int i, int j) const 
{ 
    return matData[i * N + j]; 
} 
Matrix::Set(int i, int j, double val) 
{ 
    matData[i*N + j] = val; 
} 
Matrix::~Matrix() 
{ 
    delete matData; 
} 

有人可以解釋是什麼原因導致這個錯誤,爲什麼當我回來的是在那個matData所指向的內存位置的陣列中的某個點的值它被拋出。謝謝!

+0

它應該是'delete [] matData'。 – Gene

+0

請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。你應該先嚐試遵守[The Three of](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)並再次嘗試。 – MikeCAT

+0

也許......在你的構造函數中,你正在使用double * matData = ...,它創建一個新變量,而不是類成員。嘗試只寫matData = new double [N * M] –

回答

3

double* matData = new double[N*M];在構造函數中創建一個新指針。內存馬上泄漏,並且成員指針仍未初始化。

刪除double*以引用成員變量。

2

成員變量matData未初始化,因此解除引用會引起段錯誤。

停止在構造函數中聲明局部變量matData(它影響成員變量)並在對其進行解引用之前初始化成員變量。

其他注意事項有:

  • delete[]必須用來代替delete刪除什麼是通過new[]分配。
  • 服從The Rule of Three:正確定義複製構造函數和賦值運算符以避免複製指針造成的問題(不是數組中的數據)。
0

我不明白爲什麼你不只是使用std::vector<>,因爲你需要它分配和刪除未使用的內存,它也是安全的。它也可以像其他任何陣列一樣工作,例如std::vector<int> myArray;,在填充它之後,您可以使用它作爲myArray.at(0);myArray[0];。另外std::vector<>知道它的大小,可以派上用場。