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

MFC Discussion :

[VS2005]Destructeur qui remet les variables à 0


Sujet :

MFC

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut [VS2005]Destructeur qui remet les variables à 0
    Bonjour à tous,
    Il me semble que le compilateur de VS6 (en mode debug en tous cas) générait du code pour que, lorsqu'un destructeur était appelé, il remette le contenu des variables à 0 ou à 0xCC (int 3h).
    Or sous Visual Studio 2005, ca n'a plus l'air d'être le cas et je trouve que les erreurs venant du fait que l'on utilise des variables d'un objet qui n'existe plus, sont moins faciles à repérer puisque le contenu des variables n'est pas écrasé si l'on utilise l'objet directement après qu'il soit détruit.
    Y-a-t-il une option à activer qqe part pour que ce code soit généré en mode debug ou faut-il le faire à la main dans le destructeur?

    Merci d'avance,
    Nicolas

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    s'appuyer sur ce genre de comportement est dangereux et non standard (et je n'ai pas verifié la raz des variables en vc6 + debug etait effective).
    la raz des variables est a ta charge.
    si je détruis un pointeur dans le destructeur je remets l'adresse a NULL derriere me semble plus adequate.
    ton probleme devais deja existé en release.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Je me doute bien que ce genre d'erreurs ne devrait pas arriver si on a bien pensé nos objets. Mais lorsqu'on débutte, on n'a pas toujours les mécanismes bien en tête et certaines erreurs de debutant peuvent arriver. Je trouvais cette manière de faire plus pratique pour repérer les erreurs, histoire "d'être sûr", même si, logiquement, c'est lors du developpement que l'on doit se rendre compte de ces erreurs et non lors de l'execution.
    Parce que si je dois m'amuser à le faire dans chaque destructeur, j'aurais préféré que le compilateur le fasse pour moi, quitte à me mettre un gros label en rouge disant que ce n'est pas bien du tout, à coté de la case à cocher pour activer l'option
    Sinon je suppose qu'un code comme memset(this, 0, sizeof(MonObjet)); ne fonctionnerait pas à cause de l'alignement, du fait que this ne pointe p-e pas sur la première variable membre, ... ?!

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Avec VC++ 6 t'es sûr que c'est pas juste en debug ce comportement ?
    this ne pointe pas sur la première variable membre si tu as une classe avec une vtable (fonction virtuelle...). Fait un memset sur l'adresse de la première donnée membre.
    Mais y'a peut être mieux, plus simple et générique : redéfinir l'opérateur delete pour qu'il fasse le memset(0). Ca ne marchera pas pour les objets automatiques (statiques), mais c'est plus rare d'utiliser ce genre d'objet après qu'il ait été détruit.
    Utilise plutôt des pointeurs inteligents pour t'épargner tout ces soucis.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Pour VC6, comme je l'ai dit, il me semble que ce ne soit qu'en mode debug, oui.
    Faire un memset sur l'adresse de la première variable membre avec la taille de l'objet ne posera pas de problèmes avec l'alignement?
    sizeof retourne la taille réelle de l'objet ou celle qu'il "devrait faire" selon ses variables membres?

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    sizeof tient compte de l'alignement = taille réelle de l'objet.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    OK
    Merci à tous pour vos réponses
    Mais en gros, puisqu'on en revient à faire le travail qu'effectuait le destructeur sous VS6 en mode debug, n'y aurait-il pas quand même une option pour remettre toutes les variables à 0 "automatiquement" sous VS2005?

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Pas que je sache.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Ok merci à tous de votre aide. Dorénavant, je remettrais mes variables à 0 moi-même ou je ferai attention à ne pas utiliser d'objets qui ont été détruits.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/08/2013, 16h34
  2. Activité qui récupère les variables d'un service
    Par wataiso dans le forum Android
    Réponses: 11
    Dernier message: 03/12/2012, 15h50
  3. script .pl qui lit les variable post
    Par my_isac dans le forum Web
    Réponses: 3
    Dernier message: 15/10/2008, 11h15
  4. Construire un formulaire qui ecrase les variables hidden
    Par Battosaiii dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 14/04/2006, 12h58

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