Access violation [Résolu]

Signaler
Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009
-
Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009
-
Bonjour,

J'ai créé une appli SDI [VC6]. Grace à un dialog bar et ses boutons, je peux afficher différentes FormView. Jusque là ça fonctionne. Plusieurs de ces vues utilisent une classe dérivée de CObList. Dans 2 de ces vues (disont VueA et VueB), je peux modifier ma classe CObList. Cette classe est chargée (new) et décharger (delete) chaque fois que la vue est active (et à l'inverse non active).
Quand je quitte mon appli sur n'importe quelle vue active sauf VueA et VueB (même en ayant afficher VueA ou VueB )= pas de pb.

Maintenant si la vue active est VueA ou VueB, le destructeur de ces FormView cherche à détruire un élément et plante : "Access violation memory" ?! consternation. Je n'arrive pas savoir ce qu'il veut détruire.

Quelqu'un a-t-il une idée ?

7 réponses

Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009

Pb résolu, rien avoir avec la liste chainée.

Dans OnActiveView je fais appelle à une fonction qui met à jour tous les contrôles et les variables à 'zéro'.

et memset (Var,' ',100) ne marche pas quand on ferme l'appli. J'ai donc remplacé par une boucle for + Var.Empty() et bingo : plus d'accès violation ?! Allez comprendre !
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
L'infrastructure MFC se charge de détruite les instances des classes pour les vues, donc il ne faut pas faire de delete explicite sur les vues mais faire DestroyWindow (qui se chargera par la suite d'appeler delete).

Si tu doit basculer entre des vues, le mieux c'est de les créer invisible et les afficher/masquer plutot que de les créer/détruire à chaque fois.
Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009

Tu n'as pas bien compris mon soucis:

Toute mes vues sont créées par un new lors de l'appel d'OnCreateClient de mon MainFrame. J'utilise ensuite les fonctions afficher/masquer et je ne m'occupe pas de faire un delete lorsque je quitte mon appli.

Le problème réside dans l'utilisation de la liste chaînée (CObList).
Dans VueA et VueB je surcharge la fonction OnActivateView pour charger (new) ou décharger (delete) la liste.

void CMaVueA::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
static BOOL init=TRUE;
static BOOL ListeChargees=FALSE;

// pMaListeChainee = Pointeur sur ma classe CListeChainee (dérivée de CObList). Ce pointeur est membre de ma vue
if(bActivate && !ListeChargees&& this==pActivateView)
{ // je crée ma liste
pMaListeChainee = new CListeChainee;
if(!pMaListeChainee ->ChargerLesDonnees())
{// destruction de la liste si impossible de la chargée
MessageBox("Une erreur est survenue lors du chargement des données","ERREUR",MB_OK);
delete (pMaListeChainee );
pMaListeChainee =(CListeChainee *)NULL;
ListeChargees=FALSE;
ListeDetruite=TRUE;
}
else
{
ListeChargees=TRUE;
ListeDetruite=FALSE;
}

}

if(init && bActivate && this== pActivateView)
{
PremiereInitialisation(); // initialisation de mes controles
init=FALSE; // l'initialisation est faite une fois pour toute

}

if(!ListeDetruite && pMaListeChainee !=(CListeChainee *)NULL && ListeChargees && this==pDeactiveView )
{
if(bActivate )
{//je décharge ma liste si je change de vue
// pas de traitement si on ferme l'appli
delete (pMaListeChainee );
pMaListeChainee =(CListeChainee *)NULL;
ListeChargees=FALSE;
ListeDetruite=TRUE;
}

}

if(ListeChargees&& pMaListeChainee !=NULL && this!=pDeactiveView)
{
//reinitialisation des controles a chaque fois que l'on affiche la vue ainsi, les données sont toujours mises à jour.
}

CFormView::OnActivateView(bActivate, pActivateView, pDeactiveView);

}

que je mette pMaListeChainee en donnée membre ou variable globale ne change pas le problème ?!

A+
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Et ça plante en essayant de faire quoi ?

=> lancer le prog en mode DEBUG (F5), attendre le bug

à l'apparition de l'erreur, faire debug ou réessayer, le prog va sur l'erreur, aller dans View->Debug->Call Stack pour avoir la pile des fct applées
Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009

C'est quand je click sur la Croix pour fermer l'appli que ça plante.
J'ai essayé en virant le pointeur sur ma classe et en le créant dans chacune des fonctions qui en avaient besoin ( en prenant soin de faire un delete à la fin de toute ces fonctions et en affectant NULL à mon pointeur). Le problème est identique.

Le mode debug ne donne rien. En mode pas à pas je fini par arriver dans du code assembleur. J'ai beau connaître, ça ne me dit pas ce que le destructeur veut détruire (et que visiblement il a déja fait).

Le call stack pointe sur KERNEL 32!
la suite de la pile :


MonAppli! 'eh vector destuctor iterator'(void *,unsigned int,int,void (*)(void *)) + 94 bytes
CVueA::~CVueA() line 47 + 117 bytes
CVUeA::`scalar deleting destructor'(unsigned int 1) + 37 bytes
CView::PostNcDestroy() line 119 + 31 bytes
CWnd::OnNcDestroy() line 843
CWnd::OnWndMsg(unsigned int 130, unsigned int 0, long 0, long * 0x0012f0ec) line 1825
CWnd::WindowProc(unsigned int 130, unsigned int 0, long 0) line 1585 + 30 bytes


A+
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
CObList dérive de quoi ?
Messages postés
351
Date d'inscription
mercredi 21 juillet 2004
Statut
Membre
Dernière intervention
12 août 2009

CObList dérive de CObject. CObList permet d'avoir une liste de CObject (ou de dérivé).