Bug avec la fonction new

Résolu
Signaler
Messages postés
6
Date d'inscription
jeudi 1 juin 2006
Statut
Membre
Dernière intervention
3 juillet 2006
-
Messages postés
6
Date d'inscription
jeudi 1 juin 2006
Statut
Membre
Dernière intervention
3 juillet 2006
-
Voila ce que j'ai tapé et compilé sous visual studio :

char** AllouerMaj(int w, int h)
{
       char** MAJ= new char*[w*h];
        for(int l=0; l<w*h; l++)
               MAJ[l]= new char[8];
      
         return  MAJ;
}
 
j'appelle cette fonction dans le main avec un truc du genre :

char** MAJ = AllouerMaj(w,h);

quand je compile aucun probleme qd je lance le programme il plante mais pas à cet endroit (plus loin dans le programme quand je veux remplir les cases du tableau MAJ)

Mais qd j'utilise le débugeur en mode step par step, il plante au niveau du 2e new : la première allocation se passe sans problemes mais la deuxieme n'a pas lieu (ce qui explique que le programme plante plus loin). Ce qui est bizarre c que si je remplace 8 par un grand nombre (genre 256*256) l'allocatoin se passe sans probleme, Inversement si je remplace le w*h (qui valent 256 et 256 dans mes tests) dans la premiere allocation (char** MAJ= new char*[w*h];
) par un 8 la ça plante à ce niveau. Enfin si jécris ces instructions directement dans le main ça marche. Alors cke jpige pas c pourquoi une allocation qui prend bcp de place marche impec alors qu'une petite allocation ne marche pas. Je me demande donc si c pas un bug connu du compilateur visual studio (ou visual c++) ou si c vraiment du à qq chose que j'ai fait de mal à coté dans mon code source (j'ai particuliérement bien fait attention aux autre new et delete du code). Quel genre d'erreur pour provoquer ce genre de "réaction" du débuggeur ?

merci pour votre aide

4 réponses

Messages postés
6
Date d'inscription
jeudi 1 juin 2006
Statut
Membre
Dernière intervention
3 juillet 2006

en fait j'ai fini par trouvé ct un bug dans mon programme  je dépassais une zone allouée dynamiquement avant d'arriver à cette fonction (qui effectivement marche bien).

Comme quoi faire un erreur avec un new ça peut provoquer des bugs vraiment très bizarre (une allocation de grande taille marche mais pas de petite taille)  à un autre endroit dans le programme.
Messages postés
58
Date d'inscription
dimanche 12 décembre 2004
Statut
Membre
Dernière intervention
21 juin 2006

Salut,

Je suis pas sur de ce que tu veux allouer comme tableau.
Est ce un tableau de char à deux dimensions (de w char sur h char) ?

Si c'est ça (et donc que tu l'utilise comme ça après) ton allocation devrai ressembler à ça plutot:
char** MAJ= new char*[w];
 for(int l=0; l<w; l++)
        MAJ[l]= new char[h];

Si j'ai mal compris et bien je me demande à quoi ca sert de passer en paramètre 2 int, puisqu'aucun n'est utilisé sans être multiplié par l'autre
     
Messages postés
6
Date d'inscription
jeudi 1 juin 2006
Statut
Membre
Dernière intervention
3 juillet 2006

oui effectivement je pourrai passer w*h en argument j'ai laissé les 2 arguments par souci de lisibilité (w et h étant les dimensions d'une image) mais c'est pas le problème. Et c bien un tablo de taille w*h contenant chacun un pointeur vers un tableau de 8 char


 


 


 
Messages postés
58
Date d'inscription
dimanche 12 décembre 2004
Statut
Membre
Dernière intervention
21 juin 2006

Salut,

bon alors ce soir j'ai enfin accès à visual, et je me suis servi de ta fonction, une fois alloué j'ai rempli toutes les cases du tableau et je les ai affiché. Et j'e n'ai eu aucun probleme que ce soi en debug ou en release, ou en pas à pas (je suis allé jusqu'au 18ème new).

J'ai essayé avec 8, 256 et 512 comme valeurs pour w et h.

T'as quelle version de visual (moi j'ai la 2005 express)?