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 :

delete, vector et destructeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut delete, vector et destructeur
    Bonjour,

    Y a-t-il une fuite de mémoire dans le code suivant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    std::vector<void*> components;
     
    struct Component
    {
        unsigned index;
     
        Component() : index(components.size()) {};
     
        ~Component()
        {
            std::swap(components[index],components.back());
            components.pop_back();
        }
    };
     
    struct Position : Component {};
     
    struct Name : Component {};
     
    int main()
    {
        components.push_back(new Position);
        components.push_back(new Name);
        components.push_back(new Name);
        components.push_back(new Position);
        components.push_back(new Name);
     
        Name* e = static_cast<Name*>(components[2]);
        delete e;
     
        return 0;
    }
    Normalement, on fait d'abord delete, puis ensuite on enlève l'élément dans le vector, mais dans mon cas, je ne sais pas trop comment ça va se passer étant donné que delete appelle le destructeur, où justement je supprime l'élément du vector


  2. #2
    Futur Membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Par défaut
    Est-ce que ce code fuit? Il me semble que non.

    Est-ce que ce code est donc bien fichu? Oh que non.

    Une classe qui fait référence en dur à une variable globale qui contiendra toutes ses futures instances? Mmh. Pas sûr que ce pattern connaisse un grand succès.

    Si tu expliques quel est le but de ton code, on peut t'orienter vers une solution plus standard.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Par défaut
    Bah, faut dire aussi, c'est un code minimal, en pratique y aura pas de variable globale, par contre elle contiendra effectivement toutes mes instances, pour épargner ma mémoire cache.

    Le but du code ? En gros.

    J'ai ce vector de components, et un autre vector (system) que je n'ai pas fait figurer ici, qui contiendra des pointeurs sur ces components. Je veux pouvoir supprimer facilement ces components depuis system sans avoir à tenir un registre où j'enregistre à quelle position j'ai enregistré tel component.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Un vector de void* c'est pas sérieux ça

    Citation Envoyé par MrPchoun Voir le message
    par contre elle contiendra effectivement toutes mes instances, pour épargner ma mémoire cache.
    Cette opitmisation me paraît bien prématurée. Early optimization is the root of all evil. Avant d'optimiser, on fait du profiling. Pour l'instant, tu es en au design, pas encore au profiling. En plus, elle ne fonctionne pas : si tu stockes des pointeurs, les components ne seront pas contigus et ton optimisation de cache ne sert à rien ! Après je suppose que Component est polymoprhique, dans lequel cas tu n'as pas le choix, tu ne pourras pas les stocker de manière contigue facilement.

    Citation Envoyé par MrPchoun Voir le message
    Je veux pouvoir supprimer facilement ces components depuis system sans avoir à tenir un registre où j'enregistre à quelle position
    Et pourtant, tu le fais : chaque component enregistre son indice. En plus, ça ne fonctionne pas : si tu supprimes un élément au milieu du vecteur, ça va te côuter cher car tous les éléments suivants seront déplacés, et en plus leur indices ne seront plus bon, et les références stockées dans ton system ne le seront plus non plus.

    Pour faire le bon choix de la collection, il faut évaluer ton besoin:

    • Si tu veux pouvoir supprimer un élément de manière peu coûteuse sans invalider les autres références et que tu ne fais pas ou peu de parcours de la liste : std::list
    • SI tu veux faire des parcours de liste efficace : std::vector
    • Si tu veux faire les deux : tu es niqué, mais il est probable que std::vector soit meilleur.


    Ensuite, c'est une assez mauvaise idée d'utiliser des pointeurs nus, car non seulement c'est risqué, mais en plus tu ne définis pas clairement la politique de propriété de tes composants. Qui est propriétaire de l'objet ?

    • Si c'est une propriété partagée entre les systèmes, considère l'usage de std::shared_ptr
    • Si la collection "globale" est propriétaire (c'est à dire que le supprimer de la liste est équivalent à le supprimer complètement), utilise std::unique_ptr


    Et enfin, las but not least, est-ce que tu ne gagnerais pas du temps à utiliser du code existant ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    tu mets 5 éléments via new, tu les mets en void*, t'en delete 1 seul, sans destructeur virtuel
    et tu te demandes si ça fuit ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Et ne parlons même pas du fait que tu ne l'a pas enlevé du vector.

    Ton idée a un nom: le pattern flyweight.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/08/2013, 20h56
  2. Réponses: 7
    Dernier message: 10/03/2007, 11h08
  3. probleme de delete dans un destructeur
    Par Chewbi dans le forum C++
    Réponses: 6
    Dernier message: 12/03/2006, 00h29
  4. erase et delete d'un vector
    Par Jahjouh dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/11/2005, 23h11
  5. destructeur et vector
    Par diefo dans le forum SL & STL
    Réponses: 14
    Dernier message: 02/03/2005, 12h15

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