Bonsoir,

J'ai crée une classe t_matrix dont certains opérateurs ont été surchargés, afin notamment de supporter l'addition, la soustration et la multiplication de deux objets t_matrix. Les données sont stockées dans un tableau float *. Voici les prototypes de ces surcharges :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
        // operator=:
        //  defines operator =
        t_matrix & operator=(const t_matrix & toCopy);
 
        // operator+:
        //  computes this+arg
        t_matrix operator+(const t_matrix & arg);
 
        // operator-:
        //  computes this-arg
        t_matrix operator-(const t_matrix & arg);
 
        // operator*:
        //  computes this*arg
        t_matrix operator*(const t_matrix & arg);
 
        // operator*:
        //  computes this*arg
        t_matrix operator*(const double arg);
 
        // operator*:
        //  computes arg*_matrix
        friend t_matrix operator*(const double arg, const t_matrix & _matrix);
J'ai également défini un constructeur de copie :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
        // t_matrix:
        //  constructor of copy
        t_matrix(const t_matrix & toCopy);
Prenons un exemple :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
t_matrix A(3, 3, 1.0); // dim : m*n, valeur initiale = 1.0
t_matrix x(3, 3, 3.0);
t_matrix K = A*x;
t_matrix L = A;
t_matrix M(3, 3, 0.0);
M = A;
Lorsque j'effectue l'affectation via t_matrix L = A, le constructeur de copie est bien appelé et fait son travail. Lorsque j'effectue l'affection via M = A, il s'agit de l'opérateur d'affectation. Mais lorsque j'effectue A*x, qui retourne un objet de type t_matrix, ni le constructeur de copie ni l'opérateur d'affectation n'est appelé.

J'obtiens donc par la suite des erreurs de double free or corruption probablement à cause d'un double appel delete mat, où mat est de type float *.

Une subtilité (ou pas) doit probablement m'échapper... Help!

En vous remerciant d'avance,

Nicolas.