dominique.stock
Messages postés436Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention 8 octobre 20087 11 oct. 2007 à 16:29
Bonjour,
Ce sont des objets créés mais pas libérés en général ....
Si tu fais un pas à pas , cela peut te permettre de trouver l'erreur.
Sinon, utilises quelque chose comme Memcheck ...
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 11 oct. 2007 à 18:50
c'est que tu (ou l'api windows) essaye d'acceder a des pointeurs nil (=0).
Verifie que tu utilise correctement les fonctions de l'api.
Certaines fonctions necessite que tu leur passe un buffer qu'elles remplissent. si tu n'as pas initialisé le buffer, tu obtiens une erreur de ce type
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 11 oct. 2007 à 19:14
Un objet non libéré ne provoque pas d'erreur ... du moins il ne le doit pas.
tant qu'une instance est valide il ne peut pas y'avoir de violation d'accés a cette derniere.
par contre, une instance non allouée ou deja libérée devient irremediablement invalide et donc un appel a une telle instance provoque immediatement une violation d'accés car l'addresse memoire ne pointe plus sur un espace memoire valide.
c'est pour cela qu'il existe des fonctions tel Assigned ou FreeAndNil ou même la valeur Nil (Null).
une reference (objet ou pointeur) doit toujours etre remis a Nil pendant l'execution d'un programme, car tant que ce n'est pas fait l'instance contient toujours une addresse memoire.
cette reference n'est rien d'autre qu'une variable qui stocke une addresse memoire sur un entier 32bit, cette addresse memoire nous permet d'acceder a un espace memoire qui vas contenir les données soit d'un objet, soit d'un type quand il s'agit d'un pointeur.
il une erreur frequente, qui aboutie sur une violation d'accés :
- l'appel d'un constructeur de classe sans assignation de son retour (appel direct de Create sans assignation) :
"MonObjet.Create" au lieu de "MonObjet := ClasseObjet.Create" ou "With ClasseObjet.Create do"
qu'est-ce qui se passe dans ce cas :
MonObjet.Create; { on crée une reference mais elle est immediatement perdue }
MonObjet.Caption := 'oops'; { violation d'accés, MonObjet n'est pas une reference valide }
MonObjet.Free; { violation d'accés, MonObjet n'est pas une reference valide }
par contre :
MonObjet := ClasseObjet.Create; { on crée une reference est elle est assignée a MonObjet }
MonObjet.Caption := 'ouf!'; { pas de probleme }
MonObjet.Free; { pas de probleme ici non plus }
MonObjet.Caption := 'i''m an idiot!'; { violation d'accés sur tentative d'accés a une instance detruite }
With ... Do fonctionne comme si on utilisait la variable MonObjet donc :
with ClasseObjet.Create do { pas de probleme }
try
Caption := 'youpi!'; { pas de probleme }
finally { assure la certitude de la liberation }
Free; { pas de probleme }
Caption := 'Idée stupide'; { violation d'accés sur tentative d'accés a une instance detruite }
end;
remettre a Nil une reference permet d'effectuer un test simple avant un code, ce test permet de reduire les violation d'accés, mais on devrat toujours etre vigilant a ce que l'on fait.
on peut donc faire :
if not Assigned(MonObjet) then { assure qu'on ne vas pas ecrasser une instance existante }
MonObjet := ClasseObjet.Create;
try
{ exploitation de MonObjet }
finally
FreeAndNil(MonObjet); { libere et remet a nil la reference pour assigned() }
end;
voila pour les objets, le concept est le même pour les pointeurs, car une reference d'objet n'est rien d'autre qu'un pointeur, a peu de choses prés.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 11 oct. 2007 à 19:21
pour les API travaillant surtout avec des pointeur ou handle il y a deux test a faire pour s'assurer qu'une reference est valide :
pour un Handle :
if MonHandle <> INVALID_HANDLE_VALUE then ... on peu l'utiliser
pour un pointeur :
if MonPointeur <> Nil then ... on peu l'utiliser
et pour un objet (rappel) :
if Assigned(MonObjet) then ... on peu l'utiliser
cela t'eviteras les problemes de violation d'accés. par contre, si ta reference a été mal libérée ou mal initialisée tu aura d'autres erreurs qui surviendront.
donc il ne faut pas oublier :
- de tester si on ne vas pas ecraser une instance existante avant de la créée.
- de tester la validitée d'une instance avant d'y acceder.
- de liberer correctement une instance (grace a Try Finally ou Try Except).
- de bien finaliser les references (par remise a Nil (pointeur et objet) ou Invalid_Handle_Value (handle, dc, hwnd))
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 11 oct. 2007 à 23:41
Le titre du sujet n'a rien à voir avec le contenu, je supprime le thread ou je modifie le titre ?
allez, je modifie ... mais gaffe, la prochaine fois mets un vrai titre.