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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    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
    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 émérite
    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
    Par défaut
    est-ce que tu pourrais poster une exemple minimal de l'utilisation de ton vector?

  3. #3
    Membre éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    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
    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 Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    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 éclairé
    Profil pro
    System Integration Project Manager
    Inscrit en
    Octobre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 51
    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
    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 Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    c'est une classe CSmartPtr, fait maison. idnetique a shared_ptr en fonctionnalité
    Une raison de pas utilisé shared_ptr?

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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>).

  8. #8
    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 : 50
    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
    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.

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

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