Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1759 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Assigned(MonObjet) provoque un EAccessViolation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Assigned(MonObjet) provoque un EAccessViolation

n°1640040
el zozo
Stroumf Grognon
Posté le 09-11-2007 à 13:07:42  profilanswer
 

J'ai un objet de type TDOMDocument.  
A un moment, je souhaite tester son existence (pour le réinitialiser) mais voilà! j'ai une violation d'accès.
 
Le code peut se resumer ainsi:


TExercice
protected
  XMLexercice : TDomDocument;
public
  constructor create;
  procedure Reinitialisation
end;
 
constructor TExercice.create;
begin
  XMLexercice := TDomDocument.create;
end;
 
procedure TExercice.Reinitialisation;
begin
  if assigned(XMLexercice) then  //[#ff2a00]ça plante ici[/#ff2a00]
    XMLExercice.free;
 
  XMLexercice := TDomDocument.create;  
end;    


Le résultat est le même en remplaçant "if assigned(XMLExercice)" par "if XMLexerice=nil" et je ne comprend pas comment un test aussi basique peut générer un plantage   [:wardrone]  
 
Durant une execution pas à pas, lorsque je passe la sourie sur XMLexercice, on me dit "valeur inaccessible". Par contre, le code passse bien par le contructeur avant et l'objet est utilisable (et utilisé sans être détruit) à ce moment.


Message édité par el zozo le 10-11-2007 à 12:10:15

---------------
Si vous êtes enseignant en maternelle ou primaire, mon boulot peut vous interesser.
mood
Publicité
Posté le 09-11-2007 à 13:07:42  profilanswer
 

n°1640586
KangOl
Profil : pointeur
Posté le 10-11-2007 à 00:29:49  profilanswer
 

la méthode Free est une méthode spéciale : elle ne plante pas sur les objets à nil. tu n'as donc pas besoin de vérifier la validité du pointeur avant de désalouer la mémoire.

n°1640630
el zozo
Stroumf Grognon
Posté le 10-11-2007 à 12:09:13  profilanswer
 

KangOl a écrit :

la méthode Free est une méthode spéciale : elle ne plante pas sur les objets à nil. tu n'as donc pas besoin de vérifier la validité du pointeur avant de désalouer la mémoire.


Tien! Je savais pas, ça!  
Mais pour le coup, ça plante quand même. On dirait que j'arrive à avoir un pointeur corrompu.  [:calimero]  
 Je supose que ça vien d'un mélange maleureux entre l'architecture COM et mon pauvre Delphi7, mais je pige pas


Message édité par el zozo le 10-11-2007 à 12:11:31

---------------
Si vous êtes enseignant en maternelle ou primaire, mon boulot peut vous interesser.
n°1640665
KangOl
Profil : pointeur
Posté le 10-11-2007 à 14:31:37  profilanswer
 

au fait pour les DomDocument et autres XMLDocument, faut passer par les Interfaces et donc ne pas liberer la mémoire soi-même.

 
Code :
  1. procedure foo;
  2. var
  3.   xml : IXMLDocument; //< notez le "I"
  4. begin
  5.   xml := TXMLDocument.Create(nil);
  6.   doStuff(xml);
  7.   // pas de liberation mémoire, vu qu'on est en présence d'un objet interfacé
  8. end;




Message édité par KangOl le 10-11-2007 à 14:32:12
n°1640678
el zozo
Stroumf Grognon
Posté le 10-11-2007 à 14:54:49  profilanswer
 

Si on ne la libère pas "soit même", quand la libère t-on, alors?
La question n'est pas optionnelle : je compte bien ouvrir et fermer un max de document XML. Et en Delphi32, point de ramasse miettes
 
Dans le cas d'objet et d'interfaces "normale", pas de lézard. Si TMonObjet implémente IMonInterface, la méthode TMonObjet.Create alloue la mémoire et TMonObjet.free la libère.
 
Pour les XMLDocument, j'ai déjà fait une mécanique similaire (valais mieux : j'ouvrais et fermais 5000 documents) : Je crée un TDomDocument, j'en tire une IXMLDocument (via la méthode DéfaultInterface) et pour libérer la mémoire, j'utilise le Free du TDomDocument
 
Sauf qu'en fait, je m'y perd entre les divers versions des MSXML et que je sais plus quelle version j'utilisais à l'époque :-/

Message cité 1 fois
Message édité par el zozo le 10-11-2007 à 14:57:46

---------------
Si vous êtes enseignant en maternelle ou primaire, mon boulot peut vous interesser.
n°1646520
antp
Super Administrateur
Champion des excuses bidons
Posté le 21-11-2007 à 14:19:24  profilanswer
 

el zozo a écrit :

Et en Delphi32, point de ramasse miettes


 
Avec les interfaces, si, justement.
Pour forcer la libération de l'objet il faut juste assigner son pointeur à nil.
 
Au passage, quand tu fais un Free sur un objet il ne vaut toujours pas nil, il faut utiliser FreeAndNil(objet) ou l'assigner à nil après le Free.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1646704
el zozo
Stroumf Grognon
Posté le 21-11-2007 à 17:29:49  profilanswer
 

antp a écrit :


 
Avec les interfaces, si, justement.
Pour forcer la libération de l'objet il faut juste assigner son pointeur à nil.
 
Au passage, quand tu fais un Free sur un objet il ne vaut toujours pas nil, il faut utiliser FreeAndNil(objet) ou l'assigner à nil après le Free.


Merci maître  :jap:  

Spoiler :

J'crois que je vais me barrer et aller élever les ornithorynque en Australie. Ça m'évitera les crise de nerf  [:alph-one]


---------------
Si vous êtes enseignant en maternelle ou primaire, mon boulot peut vous interesser.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Assigned(MonObjet) provoque un EAccessViolation

 

Sujets relatifs
[c/c++/dll]Pourquoi ce programme provoque une erreur (windows)? 
Plus de sujets relatifs à : Assigned(MonObjet) provoque un EAccessViolation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR