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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    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
    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
    Par défaut


    quel est le souci ?
    quelle est la question ?

  3. #3
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    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
    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 chevronné
    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
    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    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.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    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 ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre chevronné
    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
    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
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    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
    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 chevronné
    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
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    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 !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

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

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