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 :

std::vector empty et myfirst != 0 -> crash


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Points : 112
    Points
    112
    Par défaut std::vector empty et myfirst != 0 -> crash
    Bonjour,

    y a t il un moyen de forcer le membre interne _myfirst d'un std::vector a etre = 0 qd le vecteur est vide ?

    J'ai un cas ou le vecteur est vide et myfirst != 0 et a l'appel du destructeur du vector, ca crashe l'appli.

    Avec un std::list, je n'ai pas ce pb !

    V

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    est-ce que tu pourrais poster une exemple minimal de l'utilisation de ton vector?

  3. #3
    Membre régulier
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Points : 112
    Points
    112
    Par défaut
    ca va etre difficile

    Le contexte est le chargement d'image a partir de plugin.
    dynamiquement, ca se passe comme ca :
    - le reader charge les images. ce mecanisme utilise des plugins dans des DLLs
    - une fois les images chargées, le reader les copie avec d'avoir les images dans l'espace memoire de l'appli. Durant cette copie, on demande au plugin de liberer la memoire allouée a chaque image une fois cette derniere copiée.
    - le reader communique par un vector<SmartPtr<Image> >

    dans la methode Read, j'ai donc quelque chose comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<std::string> files
    std::vector<smartptr<Image> > l_pImgs;
    Plugin->Read(l_pImgs, files);                 // les images sont dans l'espace memoire du plgin
    CopyImage(l_pImgs);                          // copies les images dans l'espace memoire appli --> l_pImgs est vide
    lorsque le destructeur est appelé pour l_pImgs, j'ai un crash car bien que le vector ait une taille nulle, myfirst != 0 et du coup, dans le code, ca appelle une méthode deallocate... a la fin de ce process, j'ai une corruption de HEAP alors que toute la memoire a deja ete desallouée.

    avec std::list, je n'ai pas ce pb !

    V

  4. #4
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    C'est quoi ton smartptr? un shared_ptr? un auto_ptr?

    Quand tu dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<smartptr<Image> > l_pImgs;
    Ca veut dire que vector prend une responsabilité partagée sur les objets. C'est ça que tu veux? Parce que là :
    Durant cette copie, on demande au plugin de liberer la memoire allouée a chaque image une fois cette derniere copiée.
    j'ai l'impression que la libération se fait à l'extérieure !

  5. #5
    Membre régulier
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par poukill Voir le message
    C'est quoi ton smartptr? un shared_ptr? un auto_ptr?
    c'est une classe CSmartPtr, fait maison. idnetique a shared_ptr en fonctionnalité

    Citation Envoyé par poukill Voir le message
    Quand tu dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<smartptr<Image> > l_pImgs;
    Ca veut dire que vector prend une responsabilité partagée sur les objets. C'est ça que tu veux?
    non, ca veut dire que les images qui arrive dans l'appli via l'appel a cette methode pourront etre partagées

    Citation Envoyé par poukill Voir le message
    Parce que là :

    j'ai l'impression que la libération se fait à l'extérieure !
    en fait, la liberation se fait dans le plugin, pas dans l'appli

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    c'est une classe CSmartPtr, fait maison. idnetique a shared_ptr en fonctionnalité
    Une raison de pas utilisé shared_ptr?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Membre régulier
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par Goten Voir le message
    Une raison de pas utilisé shared_ptr?
    juste une raison historique... Qd on a decide de passer aux smart_ptr, on utilisait encore VC6 et on arrivait pas a compiler boost donc on a opté pour notre propre SmartPtr. Puis au fur et a mesure, cette classe s'est enrichie de macros de check notamment pour voir si on passe pas des smart ptr d'un thread a l'autre..
    Il parait que les shared_ptr ne sont pas thread-safe (c'est pas moi qui le dit mais l'ing qui a developpé notre classe CSmartPtr).

    voilou

    V

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Si les shared_ptr sont thread safe au même niveau que les built-in.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Citation Envoyé par vdaanen Voir le message
    Il parait que les shared_ptr ne sont pas thread-safe (c'est pas moi qui le dit mais l'ing qui a developpé notre classe CSmartPtr).
    ce qu'il faut pas entendre...

    Vous auriez peut-être dû profiter du changement de compilateur pour revenir dessus.

    Bon sinon ton histoire de vector, c'est quand même pas top. Tu as essayé toi de faire un petit exemple minimum pour voir d'où viendrait le problème? Bon avec le coup du plug-in c'est pas évident. Parce que je mise plus sur vos classes maisons/votre utilisation que sur la stl... Peut être une corruption mémoire?

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par vdaanen Voir le message
    Bonjour,

    y a t il un moyen de forcer le membre interne _myfirst d'un std::vector a etre = 0 qd le vecteur est vide ?

    J'ai un cas ou le vecteur est vide et myfirst != 0 et a l'appel du destructeur du vector, ca crashe l'appli.

    Avec un std::list, je n'ai pas ce pb !

    V
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
    std::vector temp;
    std::swap(temp,ton_vecteur);
    }// ici ton précédent vecteur devrait être détruit.
    Ton problème me fait penser à un débordement/écrasement.

  11. #11
    Membre régulier
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : System Integration Project Manager
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 219
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    ce qu'il faut pas entendre...
    comme je ne maitrise pas les boost::shared_ptr ni nos CSmatrPtr, je n'ai jamais vraiment pu attaquer une discussion de fond avec l'intéréssé mais il n'est jamais trop tard ...

    Citation Envoyé par nikko34 Voir le message
    Vous auriez peut-être dû profiter du changement de compilateur pour revenir dessus.
    comme on a fait le changement de compilo a l'arrache, c'etait pas le moment de vouloir tout péter ....

    Citation Envoyé par nikko34 Voir le message
    Bon sinon ton histoire de vector, c'est quand même pas top. Tu as essayé toi de faire un petit exemple minimum pour voir d'où viendrait le problème? Bon avec le coup du plug-in c'est pas évident. Parce que je mise plus sur vos classes maisons/votre utilisation que sur la stl... Peut être une corruption mémoire?
    Pour l'instant c'est dans le prog de test unitaire que ca plante, je ne peux pas faire plus simple.

    J'ai vérifié que les données sont libérées et que la taille du vector decroit jusqu'a etre = 0 mais la valeur de "_Myfirst" vaut autre chose que 0.
    Et dans le code de la STL, dans une methode (je ne sais plus laquelle), il y a un test sur la valeur de _Myfirst pour voir s'il faut appeler deallocate.
    Je pense que le test est foireux sauf si un vector de taille nulle
    doit avoir _Myfirst=0 dans ce cas, il y a un pb chez moi ...

    Au fait, ca le fait aussi avec une liste, contraitement a ce que j'avais dit....

    V

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 111
    Points
    111
    Par défaut
    peut etre probleme d'options de compilation des plugins par rapport au code appelant. c'est classique. tes structures n'ont pas les meme packing/padding ou des trucs en plus (debug/release ?) à voir.
    c'est souvent incomprehensible de genre de bug et en fait c'est a cause d'une merde dans ce genre.
    bon courage

  13. #13
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Lightness1024 Voir le message
    peut etre probleme d'options de compilation des plugins par rapport au code appelant. c'est classique. tes structures n'ont pas les meme packing/padding ou des trucs en plus (debug/release ?) à voir.
    c'est souvent incomprehensible de genre de bug et en fait c'est a cause d'une merde dans ce genre.
    bon courage
    Ca ne devrait pas poser problème dans la mesure où c'est bien fait, i.e celui qui alloue désalloue. Dans ce cas, pas de problème.
    En cas de responsabilité partagée, peut être par contre...

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par vdaanen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<std::string> files
    std::vector<smartptr<Image> > l_pImgs;
    Plugin->Read(l_pImgs, files);                 // les images sont dans l'espace memoire du plgin
    CopyImage(l_pImgs);                          // copies les images dans l'espace memoire appli --> l_pImgs est vide
    lorsque le destructeur est appelé pour l_pImgs, j'ai un crash car bien que le vector ait une taille nulle, myfirst != 0 et du coup, dans le code, ca appelle une méthode deallocate...
    Si tu sais que _Myfirst!=0 c'est que t'as debuggé. Tu peux le refaire et nous donner les valeurs (d'une exécution donnée) de _Myfirst, _Mylast et _Myend juste après le CopyImage() ?
    Et au passage le sizeof(smartptr<Image>).

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    De plus, regarde la valeur de capacity, pas uniquement de size.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. std::vector : dynamique ou statique, pile et tas
    Par salseropom dans le forum SL & STL
    Réponses: 7
    Dernier message: 24/01/2005, 13h22
  2. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  3. char[50] et std::vector<>
    Par tut dans le forum SL & STL
    Réponses: 9
    Dernier message: 12/10/2004, 13h26
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59
  5. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30

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