begin process at 2012 05 29 18:16:12
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Pb de destructeur


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pb de destructeur

mardi 28 juin 2005 à 10:53:58 | Pb de destructeur

Stubbornman

Salut a tous, j'ai un pb de destructeur que je n'arrive pas a resoudre: Mon constructeur: template < class H > inline Matrix< H >::Matrix( int row, int column ) : _row (row), _column (column) { _data = new H*[_row]; for (int i = 0; i < _row; i++) _data[i] = new H[_column]; } et voici le destructeur: template < class H > inline Matrix< H >::~Matrix() { for (int i = 0; i < _row; i++) delete[] _data[i]; delete[] _data; _data = NULL; } Mon problème est le suivant: je crée mes objets sans problèmes, avec initialisation, application de méthodes, mais dès qu'il faut detruire l'objet, le prog plante. Après avoir regardé ce qu'il se passait avec le debugger, il se trouve que c'est la libération de mémoire qui plante avec: delete[] _data[i]; Je ne comprends pas pourquoi ca ne fonctionne pas... Est-ce que ca pourrais venir du fait que ce soit en template???
mardi 28 juin 2005 à 11:34:49 | Re : Pb de destructeur

Stubbornman

De façons plus lisible (toute mes excuses): Salut a tous,j'ai un pb de destructeur que je n'arrive pas a resoudre: Mon constructeur: template < class H > inline Matrix::Matrix( int row, int column ) : _row (row), _column (column) { _data = new H*[_row]; for (int i = 0; i < _row; i++) _data[i] = new H[_column]; } et voici le destructeur: template inline Matrix::~Matrix() { for (int i = 0; i < _row; i++) delete[] _data[i]; delete[] _data; _data = NULL; } Mon problème est le suivant: je crée mes objets sans problèmes, avec initialisation, application de méthodes, mais dès qu'il faut detruire l'objet, le prog plante. Après avoir regardé ce qu'il se passait avec le debugger, il se trouve que c'est la libération de mémoire qui plante avec: delete[] _data[i]; Je ne comprends pas pourquoi ca ne fonctionne pas... Est-ce que ca pourrais venir du fait que ce soit en template???
mardi 28 juin 2005 à 11:49:12 | Re : Pb de destructeur

cosmobob

salut,
as tu défini proprement un constructeur de copie par défaut et un operateur d'affectation ?
Matrix(const Matrix& b);
Matrix& operator = (const Matrix& b);

dans le cas contraire, ca va planter dans le destructeur si par exemple, tu fais une affectation entre deux matrices ou que tu passes une matrice comme parametre d'une fonction ou bien que tu fais un return d'une matrice.
la raison est que tu aurais deux matrices dont le champ _data pointe vers la meme zone memoire (si tu n'as pas défini le constructeur de copie ou l'operateur =, par défaut l'affectation ou la copie se fait en recopiant betement les champs de ta classe), et que cette zone memoire est alors détruite deux fois (et plantage la deuxieme fois).
tu dois par exemple définir l'affectation entre deux matrices de cette maniere:
template < class H >
inline Matrix& operator = (const Matrix& b)
{
     for (int i = 0; i < _row; i++)
        delete[] _data[i];
    delete[] _data; _data = NULL;

    _row = b._row;
    _column = b._column;

    _data = new H*[_row];
    for (int i = 0; i < _row; i++)
    {
        _data[i] = new H[_column];
        *(_data[i]) = *(b._data[i]);
    }
    return *this;
}

(et pareil pour le constructeur par copie)

sinon, c'est sur que ca n'a rien à voir avec les template

a+


mardi 28 juin 2005 à 11:53:28 | Re : Pb de destructeur

cosmobob

enfin c'est ca l'idée; la je me rend compte que je suis allé vite et qu'il faut faire une boucle aussi pour recopier toute la colonne de b dans le _data[i] de this (dans ce que je t'ai montré, ya que la premiere case qui est recopiée :)

sinon, connais tu le type vector ? ca t'éviterait des soucis :)
une matrice est un vecteur de vecteurs, tu peux utiliser vector<vector<H>>.

a+

mardi 28 juin 2005 à 11:53:32 | Re : Pb de destructeur

Stubbornman

En effet, j'ai pense a creer le constructeur de copie et l'operateur d'affectation: template < class H > inline Matrix< H >::Matrix( const Matrix< H >& A ) { *this = A; } template < class H > inline Matrix< H >& Matrix< H >::operator = ( const Matrix< H >& A ) { if ( _row != A._row || _column != A._column ) { // Resize de la matrice cible for (int i = 0; i < _row; i++) delete[] _data[i]; delete[] _data; _row = A._row; _column = A._column; _data = new H*[_row]; for (int i = 0; i < _row; i++) _data[i] = new H[_column]; } for (int i = 0; i < _row; i++) for (int j = 0; j < _column; j++) _data[i][j] = A._data[i][j]; return *this; } Mais peut etre est-ce la le pb...
mardi 28 juin 2005 à 11:59:45 | Re : Pb de destructeur

cosmobob

template < class H >
inline Matrix< H >::Matrix( const Matrix< H >& A )
{
    _row = 0;
    _column = 0;
    _data = 0;
  *this = A;
}

peut etre ca ira mieux apres?
mardi 28 juin 2005 à 12:04:15 | Re : Pb de destructeur

cosmobob

quand tu debugges, affiche l'adresse de chaque zone mémoire libérée, il y a 90% de chance que le plantage soit du a une zone liberée deux fois.

a+

mardi 28 juin 2005 à 12:06:16 | Re : Pb de destructeur

Stubbornman

Réponse acceptée !
Ca y est, le problème est résolu. Je tiens a te remercier cosmobob. Le problème se résoud en modifiant le constructeur par copie de la facon suivante: template < class H > inline Matrix< H >::Matrix( const Matrix< H >& A ) { _row = A._row; _column = A._column; _data = new H*[_row]; for (int i = 0; i < _row; i++) _data[i] = new H[_column]; for (int i = 0; i < _row; i++) for (int j = 0; j < _column; j++) _data[i][j] = A._data[i][j]; } Le problème étant en effet que deux objets avaient la même adresse pour le tableau de data...


Cette discussion est classée dans : pb, int, data, row, matrix


Répondre à ce message

Sujets en rapport avec ce message

vc++ : pb d'ecriture dans fichier taille sup a prévu [ par adidmamah ] g un groooooo pb qui m'épate sincerementj'ecris dans un fichier en utilisant un structure : struct data { char nom[30]; PB de matrice [ par limax84 ] J'ai un probleme d'allocation dynamique de memoire pour une matrice.pour un tableau, je procede comme ceci:int * t;t = new int [30];mais pour une matr verif CRC16 [ par sena ] Bonjour,voila j'ai un pti prog pour calculer le CRC16.Je voudrai savoir si kelkun pouvait me dire si ce code fonctionne merci. Car je n'ai qu'un seul pb readfile sous Win2k [ par VolaiL ] Voilà, j'ai un programme qui tourne impec sou Win9x, et la, je viens de la passer sous win2k, et ce con me "saute" mon readfile :/ Disons qu'il fais k pb sur une simple boucle do while :-(( [ par msoin ] jour'alors, voila, j'apprend en ce moment les fonctions à argument, et ce qui se met clocher c'est une boucle!!!!Donc voici mon code, le pb se situe Pb de class [ par SfyLer ] Imaginons :class teste{public:void fonction();void fonction2();};int teste::fonction() {int a = 1;return 0;}int teste::fonction2() {//ici j'aimerais r Probleme de sockets [ par MaDC ] J'ai fait ça, mais la reception ferme mon appli mfc sans raison... biens ur on ne reçoit rien... si qq1 pouvait m'éclairer se serait sympa de sa part lisez s'il vous plait et aidez moi .... [ par myvess ] salut et merci pour l'aide mais je sais pa si ca resouds mon probleme .en fait le but est de programmer un dictionnaire(allemand-francais).et pour ce Afficher une image avec gtkmm [ par naika585 ] Bijour tt l'monde !Je developpe une interface avec gtkmm.Mon pb est le suivant : je veux afficher une image avec gtkmm, mais sans passer par le nom du Pb de printf [ par AlexMAN ] Bonjour, Voila, j'ai un ptit pb dans la fonction ki suit : si je place le printf ki suit getch() en commentaire, le code ne fonctionne plus, au contra


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales