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++

  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 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.

  6. #6
    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.

  7. #7
    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 !

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 300
    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 300
    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++.

  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.

  10. #10
    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
    Bien je voulais utiliser des Vector, mais... on m'a dit que la strucure etait plus lourde et qu'il valait mieu pour mon utilisation temps reel et la rapidite des calculs et des differentes operation que j'ai a effectuer avec mes lignes que je gere tout ca moi meme...
    Apres je suis pret a prendre tous les conseils. Mais la je commence a me dire que j'aurais du faire un travail plus profond de preproduction... troisieme fois que je change de type de structure... ca commence a faire beaucoup...

  11. #11
    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 r0d
    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++.
    Merci pour cette reponse seche, mais ca ne repond pas a ma question. J'aime bien comprendre ce que je fais. Et meme si dans la FAQ il ecrit qu'en C++ on utilise plus des vector que de l'allocation "moulinette" comme j'ai fait, ca ne me dit pas pourquoi ni comment.
    Neanmoins, merci

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2006
    Messages : 27
    Par défaut
    Comment as-tu déclaré tabBin?
    Sinon effectivement écris plutôt delete [] tabBin; directement.

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 300
    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 300
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SpongeBob
    Merci pour cette reponse seche, mais ca ne repond pas a ma question. J'aime bien comprendre ce que je fais. Et meme si dans la FAQ il ecrit qu'en C++ on utilise plus des vector que de l'allocation "moulinette" comme j'ai fait, ca ne me dit pas pourquoi ni comment.
    Neanmoins, merci
    A ce moment là, commence par analyser le code asm produit par ton compilateur
    Je suis taquin ce soir

    Plus sérieusement, le sujet a été maintes fois discuté sur ce forum: le vecteur de la STL n'est pas plus lent qu'un tableau de type C.

    Le code suivant compile et ne plante pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int* monTab;
    monTab = new int[100];
    delete(monTab);
    Cependant, il génère une fuite mémoire des plus odieuses. Et, étant donné que ceci est interdit par la norme, personne ne peut savoir ce qu'il va réellement se passer. Et à mon avis, ça va dépendre du compilateur et du système.

  14. #14
    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
    Ah, cette reponse me convient parfaitement ! Merci beaucoup r0d.
    En revanche, elle sous entend que je vais me taper un nouveau changement de structure...ce qui ne m'enchante guere
    Mais ce sont les joies de la programation, on decouvre tous les jours quelques choses !
    Probleme RESOLU !

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Probleme RESOLU !
    Alors

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 300
    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 300
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SpongeBob
    En revanche, elle sous entend que je vais me taper un nouveau changement de structure...ce qui ne m'enchante guere
    Arf. C'est la raison pour laquelle on dit souvent que le stylo et le cahier sont les meilleurs amis du développeur

    Citation Envoyé par SpongeBob
    Mais ce sont les joies de la programation, on decouvre tous les jours quelques choses !
    Héé oui... surtout avec le C++. Parfois ça en devient même agaçant

  17. #17
    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 Laurent Gomila
    Alors
    Oui c'est fait... la remarque etait-elle utile ? Moi qui croyais que vous veniez m'aider a passer de ma structure bancal au Vector
    D'ailleurs ou puis-je trouver les informations (discussion) sur la rapidite entre l'utilisation de Vector et le mode manuel ?

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 300
    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 300
    Billets dans le blog
    2
    Par défaut
    http://www.developpez.net/forums/sho...d.php?t=195318 Regardes, en particulier, le dernier post de la première page.

    Un plus récent:
    http://www.developpez.net/forums/sho...d.php?t=369831

    Et puis, il y a une fonctionnalité "recherche" sur ce site...

  19. #19
    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
    Merci beaucoup !
    Citation Envoyé par r0d
    http://www.developpez.net/forums/sho...d.php?t=195318
    Et puis, il y a une fonctionnalité "recherche" sur ce site...
    , oui, pardon...

+ 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