Liberation de la memoire - tableau dynamique a plusieurs dimensions

Signaler
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006
-
ymca2003
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Salut
J'ai un petit probleme : j'utilise des tableaux a plusieurs dimensions, mais lorsque je veux liberer la memoire (dans le destructeur de la classe), des erreurs "Debud assertion failed" se produisent... (j'utilise VC++ 6) voila la fonction qui cree les tableaux, puis le destructeur :

void GASchedulingGenome::initialiseArrays() {

int i,j,nbOperations(getNbOperations());

schedule= new int *[5];
for (i = 0; i < 5; i++) schedule[i]= new int [nbOperations];

lookup= new int **[nbJobs];

for (i = 0; i < nbJobs; i++)
{
lookup[i]= new int *[nbOperations];
for (j = 0; j < nbOperations; j++) lookup[i][j]= new int [2];
}
}

GASchedulingGenome::~GASchedulingGenome()
{
int i,j,nbOperations(getNbOperations());

//delete schedule;
for(i=0;i<5;++i) delete schedule[i];
delete schedule;

//delete lookup
for(i=0;i<nbJobs;++i) for(j=0;j<nbOperations;++j) delete lookup[i][j];
delete lookup;
}

Si vous avez une idee de ce qui va pas...

9 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
des delete[] pour les tableaux créés avec new[].
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006

J'avais essaye aussi (me semblais bien me rappeller d'un truc comme ca) mais ca ne marchait pas non plus...
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
ce qui est possible aussi, c'est que pendant l'utilisation tu écrit en dehors des bornes du tableau et que tu écrases des données relatives à la gestion mémoire. dans ton code, il faut vérifier à chaque accès les indices passés.
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006

Je vais regarder mais ca m'etonnerait, j'avais bien fait attention a ca...
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
//delete lookup
for(i=0;i<nbJobs;++i)
{
for(j=0;j<nbOperations;++j)
{
delete[] lookup[i][j];
}
delete[] lookup[i];
}
delete[] lookup;
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006

Toujours pas...
En fait ce qui est etrange c'est qu'un simple "delete[] lookup[0][0];" dans le destructeur provoque l'erreur...

J'y connais pas grand chose en gestion de la memoire, mais peut etre que le message d'erreur te dira qqchose :
"....
Expression : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
..."
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
c'est typique d'une écriture en dehors des bornes.
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006

Ok, je vais me replonger dedans alors...
Merci
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
ce qui est possible aussi c'est que ça soit une autre variable qui te fasse planter lookup (genre une chaîne trop courte qui écrase ce qui a après, en l'occurence lookup).