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 :

validite d'une static global dans une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut validite d'une static global dans une classe
    Bonjour,

    J'ai une classe CMaClasse, definit dans un .h et .cpp(classique), sauf que dans mon cpp j'ai en haut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static typeList* uneListe = NULL;
    Tout fonctionne correctement, la liste est bien initialise une seule fois dans le contructeur et bien utilise.
    Maintenant j'ai un doute au niveau de la memoire.

    J'utilise ma classe ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Par exemple dans un main:
    CMaClasse* p1 = new CMaClasse();
    CMaClasse* p2 = new CMaClasse(); // <-- uneListe != NULL
    delete p1;
    CMaClasse* p3 = new CMaClasse(); // <-- uneListe != NULL
    delete p2;
    delete p3;
    La je pense que uneListe est creer une seule fois.

    Mais la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Par exemple dans un main:
    CMaClasse* p1 = new CMaClasse();
    CMaClasse* p2 = new CMaClasse(); // <-- uneListe != NULL
    delete p1;
    
    delete p2;
    
    CMaClasse* p3 = new CMaClasse(); // <-- ici
    delete p3;
    Lorsque je cree p3, est-ce que uneListe est cense etre plein ou vide. Dans mon cas j'ai bien uneListe != NULL, mais pourtant j'ai supprimer toutes les instances de la classe(p1 et p2).
    Est-ce que c'est normal?

    PS: il est possible que la conception soit mauvaise, mais ce code n'est pas a moi, je dois le reprendre et j'aimerai deja comprendre ce qu'il fait, avant de modifier.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une variable statique n'appartient à aucune instance de la classe, donc sa durée de vie est supérieure.

    Je ne peux pas dire grand-chose de plus sans le code du destructeur de CMaClasse...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Ok, en fait c'est un brin complique car ce n'est pas detruit dans le destructeur.
    Enfin pour faire simple, c'est une liste de buffer, on les alloue au fur et a mesure, et plutot que de les desallouer quand on en a plus besoin, on les laisse pour les reutiliser plus tard sans passer par la case malloc(), (tout ca fait a l'aide d'un compteur...).

    Mais bon je pense que tu a repondu a ma question:
    Une variable statique n'appartient à aucune instance de la classe, donc sa durée de vie est supérieure.
    du coup si je comprend bien ces variables sont directement creer au lancement du prog, et pas a la (1ere) creation de la classe?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour ta dernière question, je ne sais pas. Je ne sais pas ce que la norme permet, ni comment c'est implémenté.

    Mais ici, comme la variable est un pointeur, elle est initialisée par Autre Chose.

    Et cet AutreChose pourrait bien être le constructeur de la classe, qui ferait un if(uneListe == NULL) uneListe = new typeList();...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    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 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kacedda Voir le message
    du coup si je comprend bien ces variables sont directement creer au lancement du prog, et pas a la (1ere) creation de la classe?
    Pas exactement. En fait, les variables statiques sont vraiment crées lorsqu'elle sont initialisées. Dans ton exemple, c'est la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static typeList* uneListe = NULL;
    qui créé véritablement cette variable. Elle sera donc créée lorsque l'exécution passera la première fois à cet endroit. Elle sera alors stockée dans une partie de la mémoire dédiée aux variables statiques et n'en bougera pas jusqu'à la fin de l'exécution de l'appli.

    [edit]houla oui, je n'avais pas vu que c'était un pointeur... ça me parait dangereux ça :S

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour moi, une variable statique pointeur est moins dangereuse qu'une variable statique avec un constructeur: On contrôle mieux son le moment de son initialisation, ce qui peut être vital en cas de dépendance à un autre objet.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Oups, m'ai mal exprimé
    en fait je voulai parler de maniere generale, donc ici plutot l'instance du pointeur(les 4 octets de l'adresse je crois).
    Sinon oui la liste est bien initialisé comme dis Médinoc(enfin pas loin).

    Donc sinon... je suppose que ces variables (pointeur ou pas) sont alloués au lancement du programme.

    [Edit:NiamorH] c'est pas mon code, et pour etre honnete je sais pas encore ce qui est le mieux, j'imagine qu'il y a quand meme une raison derriere tout ca

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    ben si, non?
    car lorsque je supprime toutes mes instances je repars a zero
    alors qu'en global non

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    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 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kacedda Voir le message
    Donc sinon... je suppose que ces variables (pointeur ou pas) sont alloués au lancement du programme.
    Non, elle sont allouées lors de leur initialisation.

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Ta variable est dans l'unité de compilation, le .cpp. C'est généralement des choses qu'on voit beaucoup quand on programme en C ou dans du vieux code C++. Mais j'ai tendance à voire ça comme une mauvaise habitude.

    Pourquoi ne pas l'avoir rentrée dans la définition de la classe ?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Même si elle était dans la classe, ça ne change rien au fait qu'elle soit statique.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  2. Réponses: 15
    Dernier message: 27/03/2009, 13h37
  3. Problème d'affectation d'une liste globale dans une classe
    Par _mich_ dans le forum Général Python
    Réponses: 4
    Dernier message: 30/06/2008, 17h50
  4. Réponses: 3
    Dernier message: 14/12/2006, 10h09
  5. Réponses: 11
    Dernier message: 08/02/2006, 16h59

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