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

Composants VCL Delphi Discussion :

Delphi XE2 Create Destroy ne fonctionne plus comme avant


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut Delphi XE2 Create Destroy ne fonctionne plus comme avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      Version :=TstringList.create;
      VersionStream:=TMemoryStream.Create;
    // traitement
      version.Destroy;
      VersionStream.Destroy;
    est-ce que le destroy ne sert plus à rien ou bien il faut faire autrement ?
    je faisais comme cela avec D7 et D2009

    cordialement

    André

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut


    quel est le souci ?
    quelle est la question ?

  3. #3
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par alheuredudejeuner Voir le message
    est-ce que le destroy ne sert plus à rien ou bien il faut faire autrement ?
    je faisais comme cela avec D7 et D2009
    Tu n'aurais jamais dû faire comme ça. Il ne faut pas appeler Destroy directement mais faire un Free :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Version :=TstringList.create;
      VersionStream:=TMemoryStream.Create;
    // traitement
      version.Free;
      VersionStream.Free;
    Et le mieux serait avec des try... finally, en détruisant les objets dans l'ordre inverse de leur création.

  4. #4
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut Opération de pointeur incorrecte
    uniquement sur le TMemoryStream
    pareil avec le free...

    la question implicite est : comment dois-je procéder pour libérer l'objet

    cordialement

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par alheuredudejeuner Voir le message
    uniquement sur le TMemoryStream
    pareil avec le free...

    la question implicite est : comment dois-je procéder pour libérer l'objet

    cordialement
    non aucun changement...le problème doit venir de ton traitement.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 707
    Points : 25 589
    Points
    25 589
    Par défaut
    Citation Envoyé par alheuredudejeuner Voir le message
    est-ce que le destroy ne sert plus à rien ou bien il faut faire autrement ?
    je faisais comme cela avec D7 et D2009
    Faudrait lire l'aide !

    N'appelez pas directement Destroy. Appelez plutôt Free.
    Cela a toujours été (au moins depuis D3, avant je suppose aussi)
    Ce n'est pas faute de le répéter !

    Sinon quel est le PROBLÈME ?

    Citation Envoyé par alheuredudejeuner Voir le message
    comment dois-je procéder pour libérer l'objet
    Utilise Free ! Cela libère, il n'y a rien à faire d'autres !
    As-tu des fuites mémoires ?
    Une Exception entre Create et Free ?

  7. #7
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut vérification annulée :Opération de pointeur incorrecte
    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
    38
     
    procedure TMAJ.aVerifVersionExecute(Sender: TObject);
    Var   VersionStream :TMemoryStream; version :TStringlist;
    begin
      try
        Version :=TstringList.create;
        VersionStream:=TMemoryStream.Create;
        Memo1.lines.Add('vérification version serveur');
        HttpCli1.URL := addVersion ;
        HttpCli1.RcvdStream:= VersionStream;
        try
          begin
            HttpCli1.Head;
            ProgressBar1.Max:=HttpCli1.ContentLength;
            HttpCli1.Get;
            VersionStream.Seek(0,0);
            version.LoadFromStream(VersionStream);
            Memo1.Lines.Add('version serveur acquise : '+version[0]);
            if StrToInt(version[0]) > StrToInt(vIntVersion) then
              begin
                bInstalMAJ.Visible:=true;
                bMAJ.Visible:=false;
                Memo1.Lines.Add('Fermer toutes les fiches et cliquer sur "installer la mise à jour" ');
              end
            else Memo1.lines.Add('Il n''y a pas de mise à jour disponible');
          end;
        finally
          HttpCli1.RcvdStream.Free;
          //VersionStream.free;==> peut être un double emploie ici
          version.free;
        end;
      except
        on E:Exception do
        begin
          Memo1.Lines.Add('vérification annulée  :'+E.Message);
        end;
      end;
    end;

  8. #8
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Tu as une exception de type "Opération de pointeur incorrecte" si tu essaies de détruire un objet une deuxième fois alors qu'il a déjà été détruit.

    Delphi était moins capricieux à ce sujet avant BDS2006. Avec BDS2006, le gestionnaire de mémoire a été remplacé par FastMM qui justement détecte ce type d'anomalie et déclenche une exception (et si tu utilises la version complète et non pas celle intégrée dans Delphi, FastMM peut aller encore plus loin et détecter par exemple les objets qui continuent à être utilisés après avoir été détruit).

    Dans ton code tu as la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     HttpCli1.RcvdStream:= VersionStream;
    Puis tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     HttpCli1.RcvdStream.Free;
    Autrement dit, à cette ligne, tu détruis VersionStream. Si tu fais à nouveau la destruction de VersionStream, il est logique d'obtenir un "Invalid Pointer Operation".

  9. #9
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut je pense avoir compris
    merci à tous

    André

    PS ça fonctionnait avec D7 et D2009, ce qui ne veux pas dire que c'était bon.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 707
    Points : 25 589
    Points
    25 589
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HttpCli1.RcvdStream:= VersionStream;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    finally
          HttpCli1.RcvdStream.Free;
          //VersionStream.free;==> peut être un double emploie ici
    Faudrait vérifier le code de l'objet contenant RcvdStream !
    Est-ce qu'il fait juste copier la référence donc cela reste le même objet !
    Beaucoup utilise Assign pour dupliquer le Stream, c'est une bonne pratique mais à le problème d'augmenter la consommation mémoire ... il faudrait lire la doc du HttpCli1 à ce sujet, en général, il précise qui doit libérer quoi (si il ne l'ont pas fait, euh ... passe à TIdHttp )

    En D7, la double libération posait des problèmes aussi ! même sans FastMM, les collisions entre des Objets partagées par deux ObjectList (sans notification) provoquait ce type d'erreur !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/12/2011, 19h12
  2. Ctrl + Espace ne fonctionne plus (Delphi 7)
    Par lcxlcx dans le forum Delphi
    Réponses: 2
    Dernier message: 28/05/2007, 18h52
  3. Réponses: 8
    Dernier message: 11/10/2006, 17h41
  4. mes requetes sous access ne fonctionnent plus
    Par trialrofr dans le forum ASP
    Réponses: 12
    Dernier message: 04/12/2004, 22h52
  5. [JSP][Tomcat]Changement de context -> JSP fonctionne plus
    Par mathieu dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 01/03/2004, 09h01

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