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 :

Access violation sur une string


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut Access violation sur une string
    Bonjour,

    Un problème un peu étrange qui vient de m'arriver et dont je n'arrive pas à me défaire :

    J'ai un objet d'une classe quelconque, avec une string comme attribut.
    Je n'ai pas besoin de remplir cette string tout de suite, je tiens à ce qu'elle reste vide avant de l'initialiser dans une méthode plus tard.
    Je considère, avec raison, que le constructeur de cette string sera appelé correctement et qu'un fois mon objet créé, son membre string sera lui aussi considéré comme correct.

    Seulement voilà, lorsque dans ma première méthode utilisée je fais !_str.empty() j'ai le droit a un magnifique crash avec erreur 0xC0000005.

    Et j'ai ce problème à chaque exécution.
    Comment ceci est-il possible ?

  2. #2
    screetch
    Invité(e)
    Par défaut
    poste ton code, sinon on ne peut pas t'aider.
    peut-être ton objet a été alloué et déjà desalloué?

    beaucoup de noms commencant par underscore sont reservés, il est préférable de les mettre a la fin.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    Une petite rectification, quelque soit la façon dont je tente d’accéder à ma string, ça plante.

    Voici le code simplifié :
    .hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class X
    {
    	void handle_error (const system::error_code & e);
    	private:
    		string _auth_key;
    		bool connected;
    		/* ... */
    };
    .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void X::handle_error (const system::error_code & e)
    {
    	switch (e.value())
    	{
    		case 10054: // Connexion coupée
    			/* ... */
    		break;
    		case 10061: // Connexion impossible
    			if (!connected && !_auth_key.empty()) // Voilà la ligne responsable du crash
    			{
    				/* ... */
    			}
    			else
    				/* ... */
    		break;
    		default:
    			/* ... */
    	}
    }
    je ne fais vraiment rien de particulier, et comble de l'étrangeté, il y a deux jour ce code marchait parfaitement.

  4. #4
    screetch
    Invité(e)
    Par défaut
    a priori je dirai donc que quelqu'un de mal intentionné (en toute probabilité, toi-même en fait) ecrase de la mémoire quelque part.

    Ce que je ferais donc, si tu as un bon debugger (visual studio) c'est de mettre un breakpoint mémoire; pour cela:
    * mets un breakpoint (normal) dans le constructeur de X
    * lorsque tu vas arriver a ce breakpoint, ajoute un "memory breakpoint"/breakpoint m´emoire sur "&_auth_key"
    * continues l'execution et le programme s'arrêtera de lui même a chaque fois que _auth_key est changée

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Par défaut
    Je travaille sous Code::Blocks malheureusement ...

    Autre chose que je viens de tester :

    Si je transforme la ligne comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!connected /*&& !_auth_key.empty()*/) // Voilà la ligne responsable du crash
    Le programme fonctionne sans problème !

  6. #6
    screetch
    Invité(e)
    Par défaut
    Code::Blocks a aussi des breakpoint mémoire je pense (Data breakpoint), le principe est exactement le même-
    bon sinon il y a la méthode de dichotomie, c'est plus long mais ca marche.
    ca consiste a ajouter le code _auth_key.empty(); partout partout, surtout dans des boucles et les méthodes appelées souvent, et voir quel est le premier qui pète. Tu sauras alors que l'erreur est intervenue entre le dernier _auth_key.empty() qui n'a pas explosé et celui qui vient d'exploser.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Access Violation dans une classe
    Par randriano dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/04/2007, 18h49
  2. Access violation sur un new
    Par cedekasme dans le forum C++Builder
    Réponses: 16
    Dernier message: 23/01/2007, 14h32
  3. binding sur une string
    Par fxp17 dans le forum JSF
    Réponses: 8
    Dernier message: 08/09/2006, 11h38
  4. [Access] Requête sur une table et tri sur une autre
    Par VooDooS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2006, 15h07
  5. [VB2003][ACCESS] Question sur une requete
    Par Kanie dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/03/2006, 17h25

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