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

Langage Delphi Discussion :

Destruction d'un objet.


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut Destruction d'un objet.
    Bonjour, je découvre à peine le delphi j'ai de bonnes notions de C++ et donc de POO.

    Je suis surpris par le fait que lorsque j'effectue un .Free sur un objet créé avec un .create avec donc le constructeur par défaut, j'arrive encore à accéder aux champs de cet objet. Ils sont réinitialisés, mais j'arrive à les modifier.

    J'utilise donc la méthode FreeAndNil(monObjet) pour le supprimer complètement. Est-ce normal?

    Merci pour vos réponses.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour et bienvenue sur Developpez.com.

    Tu arrives à faire ça tant que la zone mémoire où était l'objet n'est pas écrasée par autre chose. Je suppose que tu essayes de le faire juste après le Free (ou via le CTRL+F7 lors du debuggage et ça fonctionne ! Maintenant essayes de faire la même manip avec une variable globale et dans une procédure tu créé la variable, tu lui affecte des choses dans les propriétés puis tu fais un Free dans la variable et dans une autre tu essayes d'utiliser cette même variable. Si tu appelles successivement les deux procédures tu verras que tu auras une belle violation d'accès lorsque tu tenteras d'accéder à ta variable globale dans ton seconde procédure.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Donc c'est un comportement tout à fait normal. Merci pour ta réponse rapide.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Ben c'est un comportement "normal" si tu veux mais c'est pas pour ça qu'il faut s'amuser à "défier" les violations d'accès si j'ose dire mais je sens que tu es un programmeur raisonnable

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Je vais tenter de l'être au maximum :p

    Encore merci

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    En tout cas FreeAndNil est justement là pour être sûr que tu n'arriveras plus à jouer sur la corde raide puisque cette routine déréférence le pointeur sur l'objet et donc là plus moyen d'aller se balader sur la mémoire comme ça comme tu l'as toi-même indiqué.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    Je viens de réagir à propos de cette partie de ta réponse :

    Citation Envoyé par Aka Guymelef Voir le message
    Maintenant essayes de faire la même manip avec une variable globale et dans une procédure tu créé la variable, tu lui affecte des choses dans les propriétés puis tu fais un Free dans la variable et dans une autre tu essayes d'utiliser cette même variable. Si tu appelles successivement les deux procédures tu verras que tu auras une belle violation d'accès lorsque tu tenteras d'accéder à ta variable globale dans ton seconde procédure.
    En effet lorsque je fais cette manipulation, avec donc mon objet déclaré en global, je n'ai pas de violation d'accés. As tu une explication?

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Ci-joint un petit programme d'exemple que j'aimerais que tu regardes.

    Dans le premier exemple clique sur "JusteFree" puis "TesterValeurs". En regardant le source tu pourras voir que je créé un objet, je lui affecte quelques valeurs puis je lui fait juste un Free et dans la seconde procédure j'essaye de l'utiliser. Ok effectivement j'arrive à récupérer la valeur entière de mon objet détruit et à l'afficher (bien que ce ne soit pas la bonne) mais dès que j'essaye d'afficher la chaîne patatras.

    Maintenant relance le programme et clique sur "FreeAndNil" puis "TesterValeurs". Là ça plante directement dès que je tente d'afficher la valeur entière dans ma seconde procédure.

    Mon explication (car je ne suis pas un gourou de Borland quand même ). Comme tu peux le voir dans mon second exemple, en plus du Free j'affecte la valeur NIL à ma variable ou plus exactement à mon pointeur vers l'objet (ce qui se rapproche de ce qui est fait dans la fameuse routine FreeAndNil). Dès lors je suis sûr que mon pointeur ne donne plus vers l'adresse mémoire où se trouvait mon objet mais bien NIL (le NULL en C++).
    Dans le premier cadre, certes on fait un Free sur l'objet mais le pointeur donne toujours sur l'ancienne adresse de l'objet. Dès lors tu demandes à lire la valeur entière ce qui revient à demander de lire 4 octets à partir de cette adresse mémoire mais comme cette plage mémoire a été indiqué comme libéré, autre chose est venu prendre sa place (notamment parce qu'on a changé de procédure et donc allocations sur le tas) néanmoins du binaire c'est toujours convertible en entier donc ok ça passe pour les entiers mais on a quelque chose d'incohérent.
    Par contre pour les chaînes c'est une autre histoire. Déjà une chaîne c'est un pointeur vers un tableau et de plus Delphi a une gestion mémoire des chaînes assez poussée avec un compteur de référence qui lui permet de savoir quand est-ce que la chaîne est inutilisée et peut donc la supprimée quand le compteur tombe à 0 (c'est pour ça que contrairement à C++ on a pas besoin de désallouer les chaînes de caractères explicitement). Dès lors quand le Free est tombé sur l'objet, le compteur de référence de la chaîne est tombé à 0, pouf Delphi détruit le chaîne et sûrement remet à NIL le pointeur de la chaîne.

    Voila
    Fichiers attachés Fichiers attachés

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    Ok c'est compris

    Merci beaucoup.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/10/2007, 01h55
  2. [C#] destruction d'un objet
    Par legillou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 26/06/2006, 11h19
  3. destruction d'un objet
    Par akrobat dans le forum C++
    Réponses: 46
    Dernier message: 14/05/2006, 20h32
  4. Réponses: 1
    Dernier message: 09/07/2005, 18h16
  5. Réponses: 14
    Dernier message: 02/03/2005, 18h15

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