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

Delphi Discussion :

Un pépin avec FreeMem()


Sujet :

Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut Un pépin avec FreeMem()
    Bonjour à tous

    En pas-à-pas, Delphi me signale une erreur lors de la désallocation sur un pointeur. Il pointe sur un buffer alloué avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ptr_Struct_F_CFG := AllocMem(Surface);  // J'aime bien AllocMem, qui initialise le buffer avec zéro


    Ca ne plante pas à l'exécution. Mais la désallocation a-t-elle bien eu lieu ? Sous D7, je n'avais pas ce message.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Le plus fréquemment c'est soit le pointeur n'est pas alloué ou alors il est libéré deux fois
    Tu dois avoir peut-être une différence dans la séquence d'éxécution, as-tu des events ?

    affecte à nil après libération
    et utilise Assigned pour vérifier si le pointeur est alloué avant de libérer

    Pense que c'est une notification du déboggueur, si cela se trouve, tu avais caché cette exception dans ton D7
    si ton code contient un try except, il ne remonte pas l'exception
    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

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Ce code fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      if ASSIGNED (Ptr_Struct_F_CFG) then
        begin
            Try
              FreeMem(Ptr_Struct_F_CFG);
            Except
              Err := GetLastError;
              Chn_Err := IntToStr(Err);
              MessageDlg('ERREUR EN DESALLOCATION : NUMERO ' + Chn_Err, mtError, [mbOK], 0);
            End;
      end;
    Pas d'exception générée par Delphi.

    Et j'ai bien vérifié avant d'introduire ce que tu me suggérais : le fichier binaire est bien chargé dans la structure pointée par Ptr_Struct_F_CFG . Je lui ai fait enregistrer cela dans un fichier que j'ai édité : tout est nickel.

    La désallocation est effectuée à la fin du programme. Je pense qu'il est inutile de lui affecter Nil à ce moment là ? Je le mets dans la procédure d'initialisation des variables.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    si tu as plusieurs unités qui utilisent cette variable, l'affectation à nil est plus prudente et en plus c'est à l'avantage d'être logique dans le code

    La désallocation est effectuée à la fin du programme
    Si c'est un Destroy, l'affectation à nil est recommandée
    Si c'est dans finalization, c'est moins utile, mais j'aurais tendance à faire une classe qui encapsule le tout et ne pas utiliser une variable globale pour un pointeur


    Pense que l'ordre des sections initialization et finalization n'est pas le même si tu compiles ou si tu construits

    Si tu compiles, cela ajoute la fin les unités recompilés, si tu as plusieurs unités qui utilisent cette variable,
    donc tu peux avoir des effets de bord, si une unité tente d'utiliser ton pointeur après sa libération

    Si tu construit, l'ordre reprend celle du DPR, ce petit détail en Delphi 7 m'avait poussé à affecter à nil
    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

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il y aussi les comportements en mode Debug/ Release [je travaille en C++]

    Il m'a semblé qu'en mode Debug, les pointeurs et les zones mémoires sont initialisés à NULL/ 0, contrairement au mode Release.

Discussions similaires

  1. Pépin avec une relation maitre / détail
    Par Just-Soft dans le forum Delphi
    Réponses: 3
    Dernier message: 16/07/2015, 15h00
  2. Petit pépin avec une expression régulière
    Par lsebe2 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 27/02/2015, 10h13
  3. Petit pépin avec OnClose
    Par Just-Soft dans le forum Langage
    Réponses: 3
    Dernier message: 15/12/2014, 08h35
  4. Encore un pépin avec GROUP BY
    Par Dominique49 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/03/2012, 17h05
  5. Petit pépin avec la propriété Checked dans un TMainMenu
    Par Ithomir dans le forum Composants VCL
    Réponses: 1
    Dernier message: 24/02/2006, 10h00

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