2010-03-30 6 views
0

J'ai créé une classe simple en C++ qui a un tableau dynamique privé. Dans le constructeur, j'initialise le tableau en utilisant new et dans le destructeur je le libère en utilisant delete.Segfault dans un code matriciel utilisant le nouveau

Lorsque j'instancie la classe à l'aide de la classe a = Classe (..); cela fonctionne comme prévu, mais il semble que je ne puisse pas l'instancier en utilisant le nouvel opérateur (comme Class * a = new Class (..);), j'obtiens toujours un défaut de segmentation. Ce que je ne comprends pas, c'est quand je devrais utiliser new pour instancier une classe et quand il suffit d'appeler le constructeur ou devrait-il être possible d'instancier une classe avec new ou en appelant simplement le constructeur.

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; 

Ci-dessous la définition de classe ..

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; 
} 
+3

plz montrer un peu de code, il pourrait y avoir de nombreuses raisons. –

+0

bien éléments = nouveau flotteur [n * m]; .. Je suppose que c'est nouveau [] ?? – Nils

+0

Vous devez également fournir un constructeur de copie (et probablement un opérateur d'affectation) pour que cela fonctionne de manière fiable. –

Répondre

4

Remplacer i*n + j par i*m + j. et de remplacer a[n][m] par a[i][j]

+0

Thx, mais ne résout pas le segfault que je reçois .. – Nils

+1

Fixe. remplacer 'a [n] [m]' par 'a [i] [j]' ou 'a [j] [i]'. –

+1

vous avez raison mais n = m = 3 dans son exemple. –