IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

problème d'accession mémoire


Sujet :

C++

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut problème d'accession mémoire
    Bonjour,

    ayant récemment récupérer un code c++, j'ai essayer de corriger les bugs restants.
    j'ai résolu un des bugs qui provoquai une erreur d'accession mémoire, mais je n'est pas compris comment.

    initialement la fonction était déclarée comme ça dans le fichier .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual unsigned int getNbInternalContours(){return internalContours.size();}
    Afin de pouvoir y voir plus clair et pouvoir utiliser le debug j'ai mis le code dans le fichier .cpp et j'ai enlevé le virtual car il n'était pas utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unsigned int ItemContour::GetNbInternalContours()
    {
        unsigned int nb = 0 ;
        nb = internalContours.size(); // vector 
        return  nb ;
    }
    Depuis que j'ai effectué ces changements le programme fonctionne nickel.
    Mais j'aimerais comprendre ce qui dérangeai dans le code initiale.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Quel est le type de retour de la fonction size() ?

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    la fonction size est celle de la classe vector donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    size_type size() const;
    elle renvoi un size_type

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ce qui n'est pas nécessairement un unsigned int.

    Essaye donc de forcer le transtypage dans la première version.

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    j'ai essayé mais j’obtiens toujours la même erreur

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Quel est exactement le message d'erreur ?

  7. #7
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    Access violation at address 3F50624D. Read of address 3F50624D.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ben essaye de repartir du code de base, en faisant une modification à la fois.

  9. #9
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Sur quelle expression se situe l'erreur?

    Si c'est dans la fonction, il y a un problème avec ton vecteur, montre nous comment est déclarée ta classe.

    Si c'est à l'appel de ta fonction, alors tu tente d'appeler une fonction membre d'un objet détruit ou qui n'a jamais été créé.

  10. #10
    screetch
    Invité(e)
    Par défaut
    le plus probable c'est que la fonction a été appelée sur un objet du mauvais type/ou qui a été désalloué déjà. Moi je vote pour désalloué.

    Access violation at address 3F50624D. Read of address 3F50624D. veut dire que le code a planté à l'adresse 3F5blablabla, en essayant d'executer le code binaire qui se trouvait a cette adresse, or cette adresse est invalide, ce n'est pas une adresse correcte.

    pour être plus précis, 3F50624D ressemble curieusement a une valeur de flottant; c'est la représentation binaire de 0.814 (ce qui n'est pas un hasard).

    Ca veut dire qu'au lieu de contenir un pointeur de fonction, la table de méthode virtuelle contenait un float.
    Il y a plusieurs raisons possibles pour ca, c'est un bug qui peut être très compliqué. Il se peut (90% de chances) que ton objet ait été désalloué; un autre a pris sa place, et juste a l'endroit ou il se trouvait en mémoire il y a autre chose (qui ne correspond pas a l'objet initial).
    Sache juste que tu n'as pas corrigé le vrai problème; tu le contournes. Ca pourrait crasher ailleurs.


    Pour vraiment corriger le problème; met un message ou un breakpoint dans le destructeur de l'objet qui a la fonction "getNbInternalContours". 9 chances sur 10 que l'objet sera détruit alors que tu l'utilises encore.

  11. #11
    screetch
    Invité(e)
    Par défaut
    (et remet la méthode virtuelle; au moins ca plantait. Ca DOIT fonctionner avec la methode virtuelle; quand ca marchera, alors tu pourras la retirer.)

  12. #12
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    l'objet n'a pas l'air désalloué car je peut accéder aux autres méthodes de la classe.

  13. #13
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Ca ça peut arriver et ça n'est pas une preuve. Pour le vérifier, regarde dans le code quel est le temps de vie de ton objet.

    Un test simple : tu fais un projet bidon ou dans le main tu vires tout le code et tu instancies sur la stack ton objet dans une fonction (ou dans main). Ensuite tu appelles la fonction voir si ça pose problème.


    Si oui, ya un problème avec le code qui gère le vecteur (tu nous a pas montré la déclaration de ce vecteur d'ailleur...).

    Si non, c'est que c'est bien l'objet que tu manipules qui n'est pas bon au moment ou tu appelles cette fonction. Peut être pas toutes les fois cela dit, peut être juste à un instant précis.

  14. #14
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par flamme34 Voir le message
    l'objet n'a pas l'air désalloué car je peut accéder aux autres méthodes de la classe.
    essayes d'accéder a une autre méthode virtuelle et tu vas voir le bordel

  15. #15
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Points : 86
    Points
    86
    Par défaut
    toute les autres méthodes sont virtuels

  16. #16
    screetch
    Invité(e)
    Par défaut
    tu as essayé de voir si l'objet a été désalloué?
    les erreurs de mémoires peuvent être un peu aléatoires; un petit changement et l'erreur se trouvera autre part.

    Sinon on va commencer a avoir besoin de plus d'infos: apparemment ton code tourne sous windows (le message d'erreur est très windowsien) mais es tu sous visual studio, GCC? execute tu ca dans le debuggeur? en version debug/release? etc etc

Discussions similaires

  1. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07
  2. Problème de fuite mémoire sur un idFTP
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/07/2005, 17h29
  3. Réponses: 25
    Dernier message: 16/07/2003, 20h41
  4. [ODBC] Problème entre access et ODBC
    Par StephCal dans le forum Access
    Réponses: 4
    Dernier message: 09/07/2003, 16h47
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo