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 d'un membre static de classe


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut Delete d'un membre static de classe
    Bjr

    Je veux utiliser un membre static dans une classe, du genre :

    toto.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Toto
    {
    public:
      static monType* pmonType;
    };
    Je l'initialise ds le .cpp

    toto.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monType* Toto::pmonType = new monType;
    Tout va bien, et il est dispo pour toutes les instances de ma classe Toto.
    Par contre, je ne vois pas comment se fera le delete de ce pointeur pmonType ?

    Merci !

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 464
    Par défaut
    delete n'est pas appelé sur cet objet.

  3. #3
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    En encapsulant ta variable dans un singleton, tu devrais pouvoir gérer sa durée de vie et être garant de son unicité.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Un singleton c'est peut-être aller un peu fort. Mais tu peus surment de débrouiller en jouant avec un atexit bien placé. (en passant par une classe proxy encapsulant ton pointeur et qui surcharge new et delete par exemple).

  5. #5
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    @ Efcis :

    Voici ce que je te propose :

    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
    33
    34
    35
    36
    37
     
     
    class Toto
    {
        static int *si;
     
    public:
     
      Toto()
      {
          if(si == 0)
            si = new int(20);
        }
      ~Toto()
      {
          if(si != 0)
            delete si;
      }
      int GetValue(){ return *si;}
    };
     
     
    int *Toto::si;
     
    int main()
    {
     
        Toto *t = new Toto();
        cout << t->GetValue() << '\n';
        delete t;
     
     
        system("pause");
     
        return 0;
     
    }

  6. #6
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    J'écris tellement vite que j'en ai oublié l'instruction suivante :

    à placer après le :
    dans le destructeur !

  7. #7
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Le pointeur que tu as en variable statique peut juste être considéré comme une variable globale. Le compilateur ne peut pas savoir s'il s'agit d'un pointeur qui pointe sur un objet partagé ou non, alloué dynamiquement ou non, etc. Pour lui c'est juste un pointeur, et donc il n'appellera jamais delete dessus tout seul.

    La solution de Chessmaster peut marcher si un seul objet est utilisé, mais si tu en crées deux et en détruit un prématurément tu ne pourras plus utiliser la variable si. Ou même, si tu en crées un et le détruit tu ne pourras plus utiliser la variable statique de l'extérieur, ce que tu peux avoir envie de faire pour une raison ou une autre.

    Bref si j'ai bien compris tu veux détruire un objet qui sera seulement associé et créé pour ta variable statique à la fin de ton programme. As-tu réellement besoin de l'allouer dynamiquement, en utilisant new? Tu pourrais l'allouer statiquement, ensuite fournir un accesseur qui retournerait un pointeur dessus. Et même si tu as besoin de l'allouer dynamiquement, à quoi sert-il de libérer le pointeur à la fin du programme (à moins que des choses importantes se passent dans le destructeur...)? Si tu veux néanmoins toujours allouer dynamiquement et libérer la mémoire, tu dois écrire un bout de code qui sera appelé à chaque fois que ton programme se termine (tu peux faire un méchant hack avec une classe initialisée dans une variable statique/globale, dont le destructeur sera appelé lorsque le programme se termine), par exemple à la fin du main.

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Bonjour,

    Si c'est pour quitter proprement ton programme ne t'embête pas avec sa vu que de toute manière toute la mémoire est libéré a la fin de ton programme.

    Par contre si c'est pour changer le contenu de ta valeur tu peut faire ça

    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
     
     class Toto
    {
    public:
      static monType* pmonType;
    };
     
    void     setPMontType( monType* param)
    {
      monType* var;
     
    var = pmonType;
    pmonType = param;
    delte var;
    }
    Voila si c'est au moment de la destruction de ta classe que tu veut le faire la je te dit que tu fait fausse route par contre.

    Car un type static et comme un extern en quelque sorte
    il a pour but d'être accessible a n'importe quel moment.

    C'est pratique pour faire sa par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    class Toto
    {
    public:
      static monType* pmonType;
    };
     
    int main()
    {
      std::cout << toto::pmonType << std::endl;
    }
    ou pour avoir une variable partagé dans toutes tes instances de ta classe.

    Après si c'est pour un singleton je te conseil de revoir le design pattern et sa véritable utilité.

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    @jouana: En effet l'OS normalement libère tout à la sortie, ce n'est pas une raison pour ne pas libérer correctement la mémoire.

    @coyotte507: Pourquoi utiliser un hack alros que atexit est fait pour ca : appeler une fonction particulière à la fermeture du programme (quand exit est appelé pour être exact).

  10. #10
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    La solution de Chessmaster peut marcher si un seul objet est utilisé, mais si tu en crées deux et en détruit un prématurément tu ne pourras plus utiliser la variable si. Ou même, si tu en crées un et le détruit tu ne pourras plus utiliser la variable statique de l'extérieur, ce que tu peux avoir envie de faire pour une raison ou une autre.
    Bien sûr que mon exemple de fonctionne pas correctement !!!

    Car si on vient effectivement par créer 3 objets et qu'on en détruit 2 et utilise enfin le dernier il y aura un plantage, c'est évident, puisque le pointeur à été détruit !

    Quand on gère des données communes à plusieurs objets il faut impérativement installer un compteur de référence qui en soit n'est pas trop compliqué à mettre en oeuvre.

    Mais ce que tu as soulevé est intéréssant pour le débutant comme ça il peut mieux apprendre !

  11. #11
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    Citation Envoyé par jouana Voir le message
    Bonjour,

    Si c'est pour quitter proprement ton programme ne t'embête pas avec sa vu que de toute manière toute la mémoire est libéré a la fin de ton programme.
    Quand on utilise des zones mémoires allouées dynamiquement et pour programmer proprement il vital dès qu'on en a plus besoin de les détruire.
    Attendre la fin du programme pour que le système fasse le ménage à ta place n'est certainement pas la solution.

    Image si tu as un projet énorme quels en seront les perfs, bref !!!

    Il y a ceux qui programment avec Visual et lorsqu'ils créent des pointeurs dynamiques il s'en remette au garbage collector pour ma part je pense que cette façon de programmer n'est pas bonne. Car le jour ou ils n'utiliseront pas un tel système de développement et bien ils auront du souci à te faire !!!

  12. #12
    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
    'en remette au garbage collector pour ma part je pense que cette façon de programmer n'est pas bonne. Car le jour ou ils n'utiliseront pas un tel système de développement et bien ils auront du souci à te faire !!!
    U_U y'a un GC avec visual? wow... on m'a tout caché ?


    Plus sérieusement, non y'a pas de GC avec Visual. (enfin si en C#...)

  13. #13
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    Citation Envoyé par Goten Voir le message
    U_U y'a un GC avec visual? wow... on m'a tout caché ?


    Plus sérieusement, non y'a pas de GC avec Visual. (enfin si en C#...)
    Eh bien, maintenant il n'est plus caché !

  14. #14
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    Citation Envoyé par Goten Voir le message
    U_U y'a un GC avec visual? wow... on m'a tout caché ?


    Plus sérieusement, non y'a pas de GC avec Visual. (enfin si en C#...)
    Eh bien, maintenant il n'est plus caché !

    http://msdn.microsoft.com/fr-fr/library/ms235315.aspx

  15. #15
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    C'est du C++ managé pas du C++.

  16. #16
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    C'est du C++ managé pas du C++.
    Managé ou pas, ça reste du C++ !!!

    Allez dire à microsoft que son C++ n'est pas du vrai C++ à mon avis ils vont beaucoup rire !!!

  17. #17
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par Chessmaster1966 Voir le message
    Managé ou pas, ça reste du C++ !!!

    Allez dire à microsoft que son C++ n'est pas du vrai C++ à mon avis ils vont beaucoup rire !!!
    . Le C++ managé est une extension du C++, ce n'est pas du C++, c'est un autre langage, un sur ensemble de C++ pour être précis.

    Donc, non, ce n'est pas du C++ tel qu'on en parle ici. Y'a un forum dédié au C++/CLI si tu veux.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  18. #18
    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
    Citation Envoyé par Chessmaster1966 Voir le message
    Managé ou pas, ça reste du C++ !!!

    Allez dire à microsoft que son C++ n'est pas du vrai C++ à mon avis ils vont beaucoup rire !!!
    Non c'est du C++/CLI, un autre langage. (d'ailleurs microsoft supporte aussi le C++ "standard").

  19. #19
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    . Le C++ managé est une extension du C++, ce n'est pas du C++, c'est un autre langage, un sur ensemble de C++ pour être précis.

    Donc, non, ce n'est pas du C++ tel qu'on en parle ici. Y'a un forum dédié au C++/CLI si tu veux.
    Si le C++/CLI est spécifique à microsoft c'est quand même du C++. Tu dis que c'est une extension du language, si tu vas par là les "templates" sont eux aussi une extension du language !

    Ok, c'est un sur ensemble cela reste du C++ certes C++/CLI (spécifique Microsoft) mais que beaucoup sur ce forum utilise. Qui plus est il reprend (partiellement, pour l'instant) la nouvelle furture norme C++0x !

  20. #20
    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
    euh... les templates sont spécifiés par la norme. Le CLI non. Je vois pas pourquoi tu veux mélanger les deux, même du point de vue de Microsoft ce sont bien deux produits différents ...

Discussions similaires

  1. utiliser les méthodes d'un membre static d'une classe
    Par tonio_a_588 dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2011, 21h44
  2. Appel membre static dans une autre classe
    Par cyriltec dans le forum C#
    Réponses: 2
    Dernier message: 12/04/2010, 11h23
  3. Réponses: 3
    Dernier message: 12/01/2006, 21h26
  4. pointeur membre static de classe
    Par Ca$ul dans le forum C++
    Réponses: 3
    Dernier message: 26/08/2004, 13h02
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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