Delete ne marche pas ...aidez-moi :(

Résolu
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009 - 15 févr. 2007 à 01:10
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009 - 17 févr. 2007 à 16:00
Bonjour a tous,
Voici mon code :
----
 for(int i= 1; i!= ArraySize+1 ;++i)
   delete []   ArrayPointer[i];
-----
ArrayPointer est de type char**. (un tableau a 2 dimension).
et donc, ArrayPointer[i] est un char*.
Tout est bien initialisé, le system a donné de la mémoire avec NEW, je peut meme lire les caractère que j'entre,
mais quand delete arrive...erreur.
Pourtant, avec la meme syntaxe, je peut lire les donné !!! (remplace delete par cout).
aidez-moi :(!!!

Pepsidrinker

11 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
17 févr. 2007 à 12:35
C'est bien ce que je pensais plus haut ! Tu utilises des chaines fixes pour la seconde dimention.
Tu peux donc allouer en une passe !!!

ArrayPointer = new char[ArraySize+1][MAX_STRING_LENGHT];



Et tout le reste ne sert à rien !



Sinon il faut un :

strcpy(ArrayPointer[0], "NULL_CHARACTER");

TU COMMENCES A 1 !!!!!!!!! ON TE L'A DIT 3 FOIS !!!!
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
15 févr. 2007 à 01:21
C'est normal ça?

for(int i= 1
Tu commence à 1 donc ArreyPointer[0] n'est pas supprimé.

i!= ArraySize+1
Si il y a ArraySize pointeurs, tu essais de libérer la mémoire de 2 pointeurs inexistant car en dehors des bornes.

Essais:
for(int i = 0; i != ArraySize-1 ;++i)
   delete []   ArrayPointer[i];

C++ (@++)<!--
0
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
15 févr. 2007 à 01:29
oui je lavait deja essayer mais...meme probleme.
Voila exactement l'erreur ke j'ai:

         /* verify block type */
        _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
        Cette instruction est dans un autre fichier, qui contien l'opérateur delete.
       En fait, si le block métais pas valide, je ne serai aps capable de le lire avec cout....mais la je suis bel et bien capable.
     

Pepsidrinker
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
15 févr. 2007 à 01:55
J'obtien le même type d'erreur quand j'essais de libérer 2 fois la mémoire pointé par un même pointeur:

char *test = new char[5];
delete[] test; delete[] test; // CRASH

 Si 2 ArrayPointer pointe au même endroit, c'est le crash assuré.

C++ (@++)<!--
0

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

Posez votre question
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
15 févr. 2007 à 02:02
non ,le seul delete ds mon programme est dans cette instruction, et en plus, si je peut le lire avec cout, c'est qu'il n'est pas deleté...


Lerreur arrive au premier appelle de delete.

Pepsidrinker
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
15 févr. 2007 à 11:47
Salut, tu peux mettre ton code à l'endroit ou tu fais les new stp

<hr size="2" width="100%" />TuRn3r
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
15 févr. 2007 à 17:36
Salut,
Moins d'erreurs avec chaine fixe :

#defineFIXED_STRING32



char (*pszArray)[FIXED_STRING];


pszArray = new char[10][FIXED_STRING];



delete[] pszArray; // UN SEUL DELETE !
0
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
15 févr. 2007 à 20:21
Salut !

for(int i= 1; i!= ArraySize+1 ;++i)
   delete []   ArrayPointer[i];

=> Apparemment tu aimes plus VB que C/C++...

Commencer ta boucle par 1 au lieu de 0 : c'est bien du VB !!!!

Pour  comprendre ou est ton problème, il faut aussi que tu postes le code que fait les allocations....

Postes donc le code d'allocation, et on te dépatouillera tout ca ....
0
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
16 févr. 2007 à 17:50
Aucun probleme.


Voici donc la fonction qui déclare et alloue de la mémoire (NEW)


----------------------------


ERROR CDatabase::CreateArray()
{
 ArrayPointer = new char*[ArraySize+1];
 if(ArrayPointer == NULL)
  return NOT_ENOUGH_MEMORY;
 for(int i= 1; i!= ArraySize+1; ++i)
 {
  ArrayPointer[i] = NULL;
  ArrayPointer[i] = new char[MAX_STRING_LENGHT];  //= 20 caractère
  ArrayPointer[i] = "NULL_CHARACTER"; //La valeur par defaut de la chaine...
 }
  ArrayCreated = true;
  return NO_ERROR


}

Pepsidrinker
0
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
16 févr. 2007 à 22:57
Pepsidrinker,

Hum.... c'est bien ce que je disais... le C/C++, c'est pas comme VB !

ton code présente 3 soucis majeurs :

* le loop sur le tableau à partit de 1 : ArrayPointer[0] n'est pa initialisé et donc contient une valeur indeterminée et un acces à ArrayPointer[0] est un crash assuré.

 *   Pourquoi l'expression "for(int i= 1; i!= ArraySize+1; ++i) ". Depuis des décennies, cette expression est généralement écrite :
    for(int i=


0

;


i < ArraySize

; i


++

)...
    ...ton code est moins lisible, des opérations sont inutiles (



i < ArraySize

génère moins de code machine que





i! = ArraySize+1




)

* Mais la cerise sur le gateau et par ailleur l'origine du bug, c'est :



    ArrayPointer[i] = new char[MAX_STRING_LENGHT]; 
  

  -> tu alloue de la mémoire et du fait pointer ArrayPointer[i] dessus


    ArrayPointer[i] = "NULL_CHARACTER"
    ->t


u fais maintenant pointer ArrayPointer[i] vers une constante dont la mémoire est automatiquement allouée par le compilo;


   delete []   ArrayPointer[i];
    -> tu cherche donc à désalouer "NULL_CHARACTER" , constante allouée par le compilo... C'est comme essayer de piquer la copine de Dark Vador...

remplace ArrayPointer[i] = "NULL_CHARACTER" par  :
        *

ArrayPointer[0] = 0 ou



        * strcpy(ArrayPointer[i] , "NULL_CHARACTER") ou
        * strnpcy(ArrayPointer[i], "NULL_CHARACTER",MAX_STRING_LENGHT)

Un conseil, revois les bases des pointeurs en C/C++ !

Bonne soirée.... J'espère que cela a pu t'aider !

Bon courage...
0
pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
17 févr. 2007 à 16:00
Merci messieur de mavoir ouvert les yeux sur le sujet.
Le code est maintenant dépourvus d'erreurs.

Pepsidrinker
0
Rejoignez-nous