使用new的矩阵代码中的Segfault

时间:2010-03-30 08:28:39

标签: c++ segmentation-fault

我在C ++中创建了一个具有私有动态数组的简单类。在构造函数中,我使用new初始化数组,在析构函数中,我使用delete释放它。

当我使用Class a = Class(..)实例化类时;它按预期工作,但似乎我无法使用new运算符实例化它(如Class * a = new Class(..);),我总是遇到分段错误。

我不明白的是,当我应该使用new来实例化一个类并且只是调用构造函数时,或者是否可以使用new或只是调用构造函数来实例化一个类。

float** A = new float*[3];
for (int i=0; i<3; i++) {
    A[i] = new float[3];
}

A[0][0] = 3; A[0][1] = 3; A[0][2] = 4;
A[1][0] = 5; A[1][1] = 6; A[1][2] = 7;
A[2][0] = 1; A[2][1] = 2; A[2][2] = 3;

Matrix *M = new Matrix(A, 3, 3);

delete[] A;
delete M;

在课程定义之下..

class Matrix
{
private:
    int width;
    int height;
    int stride;
    float* elements;

public:
    Matrix(float** a, int n, int m);
    ~Matrix();
};


Matrix::Matrix(float** a, int n, int m)
{
    // n: num rows
    // m: elem per rows

    elements = new float[n*m];

    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            elements[i*n + j] = a[n][m];
        }
    }
}

Matrix::~Matrix()
{
    delete[] elements;
}

1 个答案:

答案 0 :(得分:4)

i*n + j替换为i*m + j。 并按a[n][m]

替换a[i][j]