[C++ Builder] Problème EAccessViolation a la fermeture du programme [Résolu]

Sat83 172 Messages postés mardi 11 novembre 2003Date d'inscription 13 octobre 2008 Dernière intervention - 19 déc. 2007 à 11:22 - Dernière réponse : Sat83 172 Messages postés mardi 11 novembre 2003Date d'inscription 13 octobre 2008 Dernière intervention
- 21 déc. 2007 à 10:27
Bonjour!

Je viens réclamer votre aide car je suis face a un problème dont je ne comprend pas la cause.
J'ai une exception EAccessViolation a la fermeture de mon programme, et plus précisement en mode pas à pas :

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try    
    {
       Application->Initialize();
       Application->CreateForm(__classid(TFPrinc), &FPrinc);
       Application->Run();
    }
    catch (Exception &exception)
    {
       Application->ShowException(&exception);
    }                                
                    
    return 0;    
} // en pas à pas, l'exception se produit ici !!!

Ce qui est plus surprenant, c'est que j'arrive a "resoudre" le problème en ne libérant pas un objet dans mon programme :

void __fastcall TFPrinc::BtnConvertClick(TObject *Sender)
{

 MonObjet  *obj = new MonObjet  ();
 bool retour = obj ->maFonction( sourceFile, destFile, applicationPath) ;
 //[...]
 delete fichierGPS ;   // si j'enleve cette ligne, il n'y a pas d'exception
                       // à la fermeture du programme
}

A noté qu'a l'execution, il n'y a pas de problème et le "delete fichierGPS"  ne  produit aucune exception. Donc qu'il soit présent ou pas, le programme s'execute sans erreur. C'est juste a la fermeture du programme qu'une exception se produit si cette ligne est présente. J'ai trouvé par hazard que en enlevant cette ligne l'exception ne se produisait plus, j'en est deduit que c'était lié, mais rien n'est sûr!

Si vous avez une idée d'où peut provenir cette erreur, ou vers où m'orienter pour la résoudre, je suis preneur!

Merci d'avance!
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 20 déc. 2007 à 17:57
3
Merci
Bof sans code en plus difficile de dire...
Quant à ce qu'il se passe après le return, c'est le Runtime qui libère les ressources et le processus qui se termine, si quelque chose est corrompu avant ça peut planter là.

Un question tout de même : si tu fais uniquement MonObjet  *obj = new MonObjet  (); suivi de delete obj, sans effectuer d'autres manips sur l'objet, est-ce-que cela plante également?

Merci cs_juju12 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de cs_juju12
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 19 déc. 2007 à 18:19
0
Merci
En général ce type d'erreur indique que la pile a été corrompue, par exemple que tu as écris dans un tableau au-delà de ses bornes ou un problème de pointeur, enfin un truc du genre.
Cela dit ton code est très orienté objet c'est peut-être le runtime qui veut libérer un objet déjà libéré : qu'est-ce-que c'est que ton fichierGS, comment est-il créé, sous quelle portée, qu'y-a-t'il dans son destructeur?
Commenter la réponse de cs_juju12
Sat83 172 Messages postés mardi 11 novembre 2003Date d'inscription 13 octobre 2008 Dernière intervention - 19 déc. 2007 à 21:09
0
Merci
En faite c'est une erreur, ce n'est pas delete fichierGPS mais delete obj :

void __fastcall TFPrinc::BtnConvertClick(TObject *Sender)
{

 MonObjet  *obj = new MonObjet  ();
 bool retour = obj ->maFonction( sourceFile, destFile, applicationPath) ;
 //[...]
 delete obj;   // si j'enleve cette ligne, il n'y a pas d'exception
               // à la fermeture du programme
}

A noté que l'objet en question (classe MonObjet) n'a pas été devellopé par moi (mais par l'ancien dévellopeur) et que c'est une classe assez complexe utilisant notamment des DLL. Mais cette classe est assez "ancienne" dans le sens où elle a déja été utilisée à de nombreuses reprise dans des programmes et qu'il n'y a jamais eu ce genre de soucis.

En faite ma plus grosse intérogation c'est que ce passe t'il au moment ou mon programme plante:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try    
    {
       Application->Initialize();
       Application->CreateForm(__classid(TFPrinc), &FPrinc);
       Application->Run();
    }
    catch (Exception &exception)
    {
       Application->ShowException(&exception);
    }                                
                    
    return 0;    
} <= en pas à pas le programme est ici, tout va bien, j'appuis sur F8 ça plante!

Je pensais qu'après cette parenthèse le programme s'arretais, mais apparement il fait encore quelque chose qui plante. Est ce que quelqu'un ce que fait le programme entre cette derniere parenthèse et la fin réèlle du programme?

Merci d'avance si quelqu'un a une idée...
Commenter la réponse de Sat83
Sat83 172 Messages postés mardi 11 novembre 2003Date d'inscription 13 octobre 2008 Dernière intervention - 21 déc. 2007 à 10:27
0
Merci
Effectivement si je n'effectue rien entre la création et la destruction de l'objet tout se passe bien.

Et je me suis rendu compte que le problème venait de l'utilisation de la DLL utilisée par MonObjet. A defaut d'avoir resolu completement le problème, je l'ai isolé et donc je vais me debrouillé pour le minimiser au maximum.

Merci en tout cas d'avoir pris le temps pour me repondre.
Commenter la réponse de Sat83

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.