Assigned(MonObjet) provoque un EAccessViolation - Delphi/Pascal - Programmation
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.
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.
Je supose que ça vien d'un mélange maleureux entre l'architecture COM et mon pauvre Delphi7, mais je pige pas
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 :
|
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 :-/
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.
Marsh Posté le 21-11-2007 à 17:29:49
antp a écrit : |
Merci maître
Spoiler : J'crois que je vais me barrer et aller élever les ornithorynque en Australie. Ça m'évitera les crise de nerf |
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
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.