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 :

Auto - destruction


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Auto - destruction
    Bonjour
    J'ai un morceau de code assez étrange:


    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
    void UneFonction (const MaClasse& IT_member) {
            if (isSet && (__d != ::VSIVOTKind_float))
            {
                this-> VSIVOT::~VSIVOT();
                memset(this, 0, sizeof(*this));
            }
    __d = ::VSIVOTKind_frabasis;
     
         if ( !isSet )
            {
                _uneVariable_ = new MaClasse;
                isSet = 1;
            }
     
    *(_uneVariable_) = IT_member;

    En gros, il appelle lui même son propre destructeur, puis il appelle la fonction memset, qui fixe à 0 la plage libérée. OK.

    Ensuite, il se reconstruit à la volée.

    C'est assez rare de voir çà. Qu'en pensez vous? Ce code a été fait à mon avis par quelqu'un d'expérimenté, donc je ne critique pas à priori.
    Mais j'aimerais savoir ce que vous en pensez, quels sont les cas dans lesquels on a besoin de faire ca.

    merci

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Ce code a été fait à mon avis par quelqu'un d'expérimenté, donc je ne critique pas à priori.
    Je n'en suis pas si sûr. D'abord la présence d'une variable nommée "uneVariable" me fait lever les yeux au ciel et ensuite il vérifie la valeur de isSet alors que celle-ci ne peut être que fausse (si elle ne l'était pas à l'entrée de la fonction elle l'est dorénavant suite au memset). Enfin il assigne une nouvelle valeur au pointeur uneVariable sans détruire l'ancienne valeur qu'il venait juste d'instancier, ce qui crée une fuite mémoire.

    Maintenant, concernant l'appel explicite au destructeur, pourquoi pas s'il s'agit de nettoyer la classe afin de la recycler. L'appel à memset ne fait que réinitialiser les champs que le destructeur n'avait aucune raison de nettoyer.

    EDIT: boulette

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Je n'en suis pas si sûr. D'abord la présence d'une variable nommée "uneVariable"
    j'ai oublié de précisé que c'est moi qui a modifié les noms. En vrai, ca s'appelle pas comme ca.

  4. #4
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Comme il déréférence, il me semble que c'est plutôt une assignation.
    Exactement. Il alloue une plage mémoire dont l'adresse est récupérée dans uneVariable, puis il fait appel à l'operateu =.

    Un appel explicite au destructeur + memset semble plutôt tordu, de fait.
    Pq?

    Après tout pourquoi ne pas avoir une fonction de nettoyage, qu'on peut appeler du destructeur et de ce point de code?
    Je sais pas, c'est pas moi qui a fait ce code.

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Citation Envoyé par therwald
    Un appel explicite au destructeur + memset semble plutôt tordu, de fait.
    Pq?
    Parce que dans l'utilisation, normale, un appel destructeur se fait implicitement à la suite de la fin de vie de l'objet (sortie de scope d'un objet local, appel à l'opérateur delete). On peut torturer le système mais comme le montre ton étonnement ce n'est pas une manière très claire de coder...
    Citation Envoyé par deubelte Voir le message
    Je sais pas, c'est pas moi qui a fait ce code.
    Ma question était réthorique, c'était une manière de présenter ce qui me semblerait un codage plus propre de cette réinitialisation de l'objet.

  6. #6
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Parce que dans l'utilisation, normale, un appel destructeur se fait implicitement à la suite de la fin de vie de l'objet (sortie de scope d'un objet local, appel à l'opérateur delete). On peut torturer le système mais comme le montre ton étonnement ce n'est pas une manière très claire de coder...
    Indépendamment de savoir si c'est bien ou pas bien, je voudrais savoir ce qui a amené le developpeur à faire ceci. En gros, que fait la fonction UneFonction. Pour moi, elle consiste à virer l'information qui se trouve dans la plage mémoire pointée par this, puis en renseigner dans la même plage mémoire l'information contenue dans IT_member.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Enfin il assigne une nouvelle valeur au pointeur uneVariable sans détruire l'ancienne valeur qu'il venait juste d'instancier, ce qui crée une fuite mémoire.
    Comme il déréférence, il me semble que c'est plutôt une assignation. Un appel explicite au destructeur + memset semble plutôt tordu, de fait. Après tout pourquoi ne pas avoir une fonction de nettoyage, qu'on peut appeler du destructeur et de ce point de code?

  8. #8
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par therwald Voir le message
    Comme il déréférence, il me semble que c'est plutôt une assignation.
    Oups, oui, en effet, au temps pour moi.

Discussions similaires

  1. GameState auto destruction
    Par Azharis dans le forum Moteurs de jeux vidéo
    Réponses: 5
    Dernier message: 17/07/2014, 09h16
  2. Probleme de auto-destruction virtuel d'une classe
    Par djun1 dans le forum Débuter
    Réponses: 4
    Dernier message: 28/12/2013, 19h46
  3. [Toutes versions] BDD auto destructible à une date precise
    Par mouhamadrouabha dans le forum Access
    Réponses: 1
    Dernier message: 07/04/2012, 10h04
  4. [JAVA] Programme auto-destructible
    Par caparenlive59 dans le forum Général Java
    Réponses: 7
    Dernier message: 20/03/2008, 11h51
  5. [Classe] Auto destruction d'instances
    Par Clorish dans le forum Langage
    Réponses: 7
    Dernier message: 11/07/2005, 14h52

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