Erreur d'acces memoire a l'execution [Solved] - C++ - Programmation
Marsh Posté le 12-04-2006 à 17:53:00
Petit indice que j'ai oublie! Le crash se fait quand on sort de la fonction, en particulier lors de la destruction de l'objet A, c'est l'instruction "delete(_myBImpl)" qui ne passe pas.
L'erreur se manifeste sous la forme d'une fenetre popup Visual Studio.
Et enfin pour ceux qui se demandent pourquoi je fais un cast dans la methode setSecurity() de A, c'est parce en vrai, je n'utilise pas des classes A, B et BImpl mais d'autres classes plus etoffees et que j'ai besoin de faire ce cast a ce moment la.
Marsh Posté le 12-04-2006 à 17:54:42
Et je me suis trompee aussi sur l'instruction de delete. Il faut lire bien evidemment:
delete _myBImpl;
et non pas
delete(myBImpl);
Marsh Posté le 12-04-2006 à 19:06:42
dans ton premier exemple, t'as un delete, mais pas de new, y a pas à chercher ...
sinon vire ces cast, ils ne servent à rien.
bPtr = new(BImpl); -> new BImpl;
Marsh Posté le 12-04-2006 à 19:10:24
ligne 12: %s?
ligne 27: fille=base? d'habitude c'est le contraire
dans le main:
ligne 3: ``b`` est mis sur la pile
ligne 6: ``a`` va supprimer ``b`` avec un delete (qui supprime sur le tas)
Si tu utilise delete avec un objet créé sur la pile tu obtient une violation mémoire.
Marsh Posté le 13-04-2006 à 09:57:00
Bon, quelques mises au point s'imposent je crois
Comme je l'ai dit les petits bouts de code que j'ai donne sont une simplification de mon vrai code.
Je me suis trompee sur la syntaxe du printf (que j'ai mis juste pour l'exemple mais en realite je ne fais pas de printf je fais un autre buisiness )
Code :
|
Ensuite, le cast dans l'exemple que j'ai donne est inutile c'est vrai. Dans mon vrai code j'utilise dans la classe A des methodes de BImpl non definis dans B, ce qui me force a faire un cast de B vers BImpl.
Pour repartir sur le fon du probleme:
Si je comprends bien un objet qui n'est pas cree avec new est cree sur la pile, et faire un delete dessus cree une violation memoire. C'est bien ca?
Marsh Posté le 13-04-2006 à 10:28:34
> C'est bien ca?
- tout à fait
> Dans mon vrai code j'utilise dans la classe A des methodes de BImpl non definis dans B, ce qui me force a faire un cast de B vers BImpl.
- ton vrai code est faux setAttribute() devrait prendre dans ce cas un BImpl* en paramètre.
Marsh Posté le 13-04-2006 à 10:40:46
Et bien en fait, c'est un peu complique, mais je suis obligee d'utiliser le type B* en interface. Mon client ne doit pas connaitre (pour diverses raisons internes a ma societe) la classe BImpl. D'ou le cast...
Marsh Posté le 13-04-2006 à 16:42:12
J'ai pas de doc particulière à te proposer, mais il y en a plein sur le net.
Chaque classe possède un numéro, qui identifie son type. Pour vérifier que le type d'une classe polymorphe est bien celui que tu attends, tu vérifie son rtti. Sinon, tu lance une exception. Comme ça le programmeur qui utilise ta librairie et qui mets en paramètre une classe incompatible est prévenu par un message d'erreur.
C'est néanmoins une méthode à n'utiliser qu'en dernier recours. Vérifie d'abord que tu ne peut pas réarranger plus judicieusement ton diagramme objet.
Marsh Posté le 12-04-2006 à 17:13:40
J'ai une petite question concernant les mysteres de la gestion memoire en C++.
Voici les classes A, B et BImpl:
Et ma fonction de test:
Ce test plante a l'execution. Apparemment un pb d'acces memoire.
Si par contre j'utilise la factory suivante:
Et les test suivant:
Ca marche nickel! Quelqu'un pourrait-il me dire en detail ce qui se passe dans le premier cas? Pourquoi ca plante?
Merci d'avance
Message édité par agyspace le 13-04-2006 à 19:10:08