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 :

compteur d'instance et allocation statique


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Par défaut compteur d'instance et allocation statique
    bonjour,
    aujourd'hui, problèmes de comptage.
    donc, j'ai un vector dans lequel je stocke des instances d'une classe, instances créées, sauf erreur, en statique avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // dans le .h
    std::vector <Food> Foods;
    Food food;
    //et qq part dans le .cpp
    Food food(x,y);
    Foods.push_back(food);
    jusque ici, tout marche, ça compile et ça s'exécute comme prévus.

    Je désire maintenant connaitre le nombre d'instance de la classe Food en mémoire et la place que cela prend.
    j'ai donc ajouté à ma classe et au constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static int nbFood;
    static int nbMemory;
    // et
    nbFood ++;
    memory += sizeof(Food);
    Jusque ici, tout vas bien, j'en ajoute un, cela comptabilise.
    Cela se gatte lorsque je supprime un food que je voudrais du coup comptabiliser en moins dans nFood.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nbFood --;
    memory -= sizeof(Food);
    dans le destructeur m'affiche n'importe quoi, vus fort logiquement comme j'ai pu le lire, que le destructeur est appelé de façon implicite dès que le programme quitte la portée dans lequel l'objet existe, ce qui est visiblement régulièrement le cas avec des appels du type à de multiples endroits de mon programme.

    Je ne voudrais pas avoir à passez par l'allocation dynamique et les pointeurs, apparemment des vectors de pointeurs étant une quasi hérésie (surtout que je risque fort de ne pas maitriser la chose et de finir avec au mieux du code qui ne compile plus)...
    Mais j'aimerais bien tout de même pouvoir suivre le nombre de Food crées et la place occupée...

    Deux questions donc :
    1 - puis je considérer qu'apres
    le dernier food stocké et retiré de Foods n'existe plus nul part et est bien effacé de la mémoire ?
    2 - Y a t'il une combine pour faire le petit comptage tant espéré sans passer par l'allocation dynamique ?

  2. #2
    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
    Salut,

    Citation Envoyé par jahmanzaar Voir le message
    1 - puis je considérer qu'apres
    le dernier food stocké et retiré de Foods n'existe plus nul part et est bien effacé de la mémoire ?
    Oui.
    La destruction des objets est déterministe en C++. Dès que tes variables sortent de la portée et dès que tes conteneurs sont vides, les objets sont détruits.
    Seul l'allocation dynamique demande une destruction explicite (qui redevient implicite via l'utilisation de pointeur intelligent).

    Citation Envoyé par jahmanzaar Voir le message
    2 - Y a t'il une combine pour faire le petit comptage tant espéré sans passer par l'allocation dynamique ?
    Attention aux copies implicites qui font appel au constructeur par copie défini implicitement par le compilateur (Quand dois-je définir un constructeur par copie ?)
    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
     
    #include <iostream>
    struct Food
    {
       Food()
       {
          ++nbFood;
       }
       ~Food()
       {
          --nbFood;
       }
    static int nbFood;  
    };
    int Food::nbFood = 0;
     
    int main()
    {
       {
       Food f;
       Food copy(f); // appel du constructeur par copie. nbFood n'est pas incrémenté
       } // Ici destructeur de f et de copy => nbFood est décrémenté 2 fois
       assert(Food::nbFood==-1);
     
       return 0;
     
    }
    Ton constructeur par copie (comme tous les constructeurs de la classe de Food) doit incrémenter la variable statique :
    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
     
    #include <iostream>
    struct Food
    {
       Food()
       {
          ++nbFood;
       }
       Food(Food const&)
       {
          ++nbFood;
       }
       ~Food()
       {
          --nbFood;
       }
    static int nbFood;  
    };
    int Food::nbFood = 0;
     
    int main()
    {
       {
       Food f;
       Food copy(f); // appel du constructeur par copie => Ok, nbFood est correctement incrémenté
       } // Ici destructeur de f et de copy => nbFood est décrémenté 2 fois
       assert(Food::nbFood==0);
     
       return 0;
     
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Par défaut ca compte, mais ca marche plus :(
    Bonjour,
    Donc, tétu, même si l'on me dit que la que la destruction est déterministe, je veux tout de même savoir combien j'ai de food

    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      Food()
       {
          ++nbFood;
       }
       Food(Food const&)
       {
          ++nbFood;
       }
       ~Food()
       {
          --nbFood;
       }
    Cela fonctionne nickel, je sais maintenant combien j'ai de food a tout moment.
    Sauf, que mes food ne s'initialisent plus correctement, visiblement ...

    A l'initialisation d'un food, je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Food f;
    f.init(rand()%100,rand()%100);
    Foods.push_back(f);
    // puis, plus loin des appels à Food du style
    f.affiche();
    // avec dans Food :
    void Food::init(int a,int b){x = a;y = b;}
    void Food::affiche(){std::cout<<"pos x - y :"<< x <<" - "<< y<<std::endl;}
    avant de definir Food(Food const&) , cela marchais, maintenant, les x et y des foods sont à 0 ...

    peut être bien que je vais essayer de ne pas m'obstiner et arrêter de compter... mais j'aimerais bien quand même compter ...

  4. #4
    screetch
    Invité(e)
    Par défaut
    le problème c'est que maintenant que tu as defini un constructeur de copie, il faut faire toi-même la copie de Food dans ce constructeur de copie.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Par défaut

    c'est la que le bas blesse ...
    Aucune idée de la manière de faire et je ne trouve rien de clair sur la toile ... mais peut être ai je mal cherché ...
    Quelqu'un aurais t'il un début d'idée de la syntaxe à employer ?

  6. #6
    screetch
    Invité(e)
    Par défaut
    il suffit de faire la copie de tous les champs de la classe un par un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class X
    {
      int x, y, z, w;
      Foo foo;
    public:
      ...
      X(const X& other)
        : x(other.x)
        , y(other.y)
        , z(other.z)
        , w(other.w)
        , foo(other.foo)
      { s_instanceCount++;}
    };

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Par défaut
    j'avance à grand pas ...
    seul petit problème maintenant,
    ma classe étant dérivée d'une classe plus générale, s'agissant d'un champ private dans la classe mère, j'ai une erreur type membre inaccessible ... logique encore ... mais énervant ...

Discussions similaires

  1. Allocation statique de tableau en F90
    Par nicolas823 dans le forum Fortran
    Réponses: 1
    Dernier message: 21/01/2014, 13h22
  2. Vérification d'une allocation statique
    Par nsvir dans le forum C
    Réponses: 8
    Dernier message: 13/04/2013, 16h14
  3. Allocation de mémoire statique
    Par cmarcx dans le forum Delphi
    Réponses: 12
    Dernier message: 04/08/2007, 13h29
  4. [wxWidgets] Allocation statique et dynamique
    Par three minute hero dans le forum wxWidgets
    Réponses: 7
    Dernier message: 25/06/2007, 23h19
  5. Réponses: 14
    Dernier message: 23/08/2004, 07h53

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