Assigned(MonObjet) provoque un EAccessViolation

Assigned(MonObjet) provoque un EAccessViolation - Delphi/Pascal - Programmation

Marsh Posté le 09-11-2007 à 13:07:42    

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.
Reply

Marsh Posté le 09-11-2007 à 13:07:42   

Reply

Marsh Posté le 10-11-2007 à 00:29:49    

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.

Reply

Marsh Posté le 10-11-2007 à 12:09:13    

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.
Reply

Marsh Posté le 10-11-2007 à 14:31:37    

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
Reply

Marsh Posté le 10-11-2007 à 14:54:49    

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.
Reply

Marsh Posté le 21-11-2007 à 14:19:24    

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
Reply

Marsh Posté le 21-11-2007 à 17:29:49    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed