Probleme de delete suite à une allocation dynamique [Résolu]

Signaler
Messages postés
4
Date d'inscription
lundi 20 mars 2006
Statut
Membre
Dernière intervention
21 août 2006
-
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
1
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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Oue mais en fait si c'est correct. Ca alloue la place nécessaire pour contenir la chaine "blablabla".
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
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.