Probleme de delete suite à une allocation dynamique

Résolu
cs_Kaory Messages postés 4 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 21 août 2006 - 23 juin 2006 à 14:55
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 - 24 juin 2006 à 14:07
Bonjour 

j'ai un petit (ou gros faut voir) probleme je manipule des char * et j'utilise des new et lorsqu'il vient le moment de les desallouer avec delete[] mon programme plante et me le signale grace à une jolie fenetre ou il me dit "DAMAGE:after normal block (#56) at 0x00421D30"
Je vous montre un exemple de code qui ne marche absolument pas chez moi 


int main(void)
{
   char *ptr;
   char *test = "blablabla";



   ptr = new char[strlen(test)];
   strcpy(ptr,test);



   cout << ptr << endl; //l'affichage se fait correctement



   delete [] ptr; //plantage en mode debug





   return 0;
}


 Je ne pense pas avoir fait d'erreur mais si c'est le cas n'hesitez pas à me le dire.
Je developpe sous VC++ et je travaille en mode debug.

merci d'avance

5 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 juin 2006 à 15:14
ptr doit contenir un caractère de plus (le 0 terminal)
Il faut donc:
ptr = new char[strlen(test) + 1];

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
23 juin 2006 à 15:44
Vecchio a raison.
De plus, les lignes de ce genre sont à proscrires :

char *test = "blablabla";





Tu copies "blablabla" dans une zone mémoire non allouée ! Si la zone n'est pas utilisée ça fonctionnera, mais dans le cas contraire ... Violation d'acces !!!

D@runia
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
23 juin 2006 à 16:39
Oue mais en fait si c'est correct. Ca alloue la place nécessaire pour contenir la chaine "blablabla".
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 juin 2006 à 16:47
A mon avis il est plus logique de le déclarer en const char*, car tu n'est pas sensé modifier la chaine

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
24 juin 2006 à 14:07
Normalement, un compilo C++ sympa devrait donner au moins un warning
sur char* msg "blabla"; // const char* msg "kjkj"; serait le bonne forme comme le dit vecchio

En C++, les chaines sont constante (const char*) et peuvent être en mémoire read_only
(certains OS peuvent faire planter ton progamme sur un msg[1] = 'x' par exemple )

sinon pour du C++
int main( void )  ça fait penser à du C
et
return 0  // n'est pas obligatoire masi peut donner un warning sur un compilo pas très sympa.
0
Rejoignez-nous