IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Probleme pointeur : allocation/desalocation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut Probleme pointeur : allocation/desalocation
    Bonjour tout le monde,
    Je ne voulais vraiment pas poser de questions comme ca ici, mais comme je ne comprend vraiment pas mon erreur, vous etes en quelques sorte ma derniere chance. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ....
        if(nbSeg[iCam+1]>0)
          tabBin[iCam]=new LineBin[nbSeg[iCam+1]];
    ....
      if(tabBin[iCam]!=NULL)
     {
            cout<<"****_"<<tabBin[iCam]<<endl;
    	delete(tabBin[iCam]);
    	tabBin[iCam]=NULL;
      }
    Les 3 petits points sont d'autres parties du code... qui ne touche pas au pointeur tabBin[iCam].
    Voila donc c'est assez simple, le message d'erreur est le suivant :
    *** glibc detected *** free(): invalid pointer: 0x080a464c ***

    Program received signal SIGABRT, Aborted.
    [Switching to Thread -1226942784 (LWP 23401)]
    0xffffe410 in __kernel_vsyscall ()
    (gdb) where
    #0 0xffffe410 in __kernel_vsyscall ()
    #1 0xb7a679a1 in raise () from /lib/tls/i686/cmov/libc.so.6
    #2 0xb7a692b9 in abort () from /lib/tls/i686/cmov/libc.so.6
    #3 0xb7a9b87a in __fsetlocking () from /lib/tls/i686/cmov/libc.so.6
    #4 0xb7aa1fd4 in malloc_usable_size () from /lib/tls/i686/cmov/libc.so.6
    #5 0xb7aa234a in free () from /lib/tls/i686/cmov/libc.so.6
    #6 0xb7c438b1 in operator delete () from /usr/lib/libstdc++.so.6
    #7 0x080509b8 in main (argc=2, argv=0xbfa31d54) at visual8.cpp:544
    Donc, moi, je ne comprends pas en quoi le pointeur est invalide et en quoi il y a une erreur...
    Merci d'avance a tout le monde.

    p.s : desole pour les accents, je suis en ce moment sur un clavier americain.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Il faut utiliser l'opérateur 'delete []' pour libérer un tableau, cf. la FAQ à ce sujet.

    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut
    Honte sur moi
    Merci
    Mais dans ce cas, pourquoi je n'ai aucun probleme avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
       tabLine[iCam]=new Line*[nbSeg[iCam]];
     
    ....
       delete(tabLine[iCam]);
    Comprends pas, merci

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par SpongeBob
    Honte sur moi
    Merci
    Mais dans ce cas, pourquoi je n'ai aucun probleme avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
       tabLine[iCam]=new Line*[nbSeg[iCam]];
     
    ....
       delete(tabLine[iCam]);
    delete appliqué sur un tableau à la place de delete[] est un comportement indéfini : le compilo peut faire n'importe quoi. Dans la pratique, j'ai observé qu'il supprimait uniquement le premier élément du tableau.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(unsigned int i=0;i<nbSeg[iCam];i++)
    {	
         if(*(tabLine[iCam]+i)!=NULL)
          {
    		delete(*(tabLine[iCam]+i));
    		*(tabLine[iCam]+i)=NULL;
    	}
    }
     if(tabLine[iCam]!=NULL)
     {
    	delete(tabLine[iCam]);
    	tabLine[iCam]=NULL;
     }
    En l'occurence, je m'assure de bien supprimer tous les pointeurs que je cree. Donc comment savoir si je dois ici utiliser le delete [] () ou delete (). Cela reste un tableau alloue dynamiquement. D'apres la FAQ
    ca ne devrait pas passer...
    Comprend pas...
    Merci encore.

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SpongeBob
    Donc comment savoir si je dois ici utiliser le delete [] () ou delete ().
    Utiliser un vector (comme c'est expliqué dans la faq que tu as cité), ainsi tu n'auras plus la question à te poser et tu feras du C++. Parce que ton code ressemble plus à du C qu'à du C++.

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    J'imagine que c'est une illustration du principe : 'ce n'est pas parce qu'il n'y a pas l'air d'y avoir de problème qu'il n'y en a pas'

    MAT.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut
    Citation Envoyé par Mat007
    J'imagine que c'est une illustration du principe : 'ce n'est pas parce qu'il n'y a pas l'air d'y avoir de problème qu'il n'y en a pas'

    MAT.
    Oui surement, mais donc, je suis ce que me dit la FAQ et j'utilise delete [] () ou je laisse l'autre... comment puis-je verifier et comprendre la reelle difference entre ces deux zozio !

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Le problème c'est que "passer" n'est pas un critère sufisant pour que ça soit correct.

    Quelques trucs pour la lisiblité déjà :
    . on utilise 0 plutôt que NULL en C++ en général
    . pas besoin de tester si un pointeur vaut 0 avant de le 'delete' car 'delete 0;' est valide
    . pas de parenthèses à 'delete', ni à 'delete []' non plus

    Après j'avoue que j'ai un peu de mal à savoir ce qu'est ton tabLine exactement... Un tableau de Line ?
    Tu ne veux pas utiliser des vecteurs plutôt ? Ca évite justement d'avoir à jongler avec tout ça...

    MAT.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme d'allocation avec un malloc
    Par theshark85 dans le forum C
    Réponses: 11
    Dernier message: 25/04/2006, 17h30
  2. Probleme Pointeur - API
    Par syannic dans le forum C
    Réponses: 18
    Dernier message: 10/10/2005, 09h51
  3. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  4. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 13h42
  5. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo