2016-11-19 55 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<>知道它的大小,可以派上用场。