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 :

Erreur : entrée dans void __cdecl _unlock (int locknum) VS2012


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Erreur : entrée dans void __cdecl _unlock (int locknum) VS2012
    Bonjour,

    Je développe une application console avec vS2012 update4 en C++.

    suite à l'appel du bout de code suivant :

    *this = ResultInter

    qui appelle l'opérateur =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BOOL_STRUCT& BOOL_STRUCT::operator =(const BOOL_STRUCT&  Op)
    {
    	OpOk = false;
    	// Controle A = A ??? impossible/inutile/erreur
    	if(this == &Op || !Op.OpOk || (Op.nbbits <= NULL) || (Op.boolfield == NULL)) return *this;
    	
    	if(boolfield != NULL) delete [] boolfield;    // erreur entrée dans _unlock
    ........
    }
    déclenche une erreur et fais appel à la fct ci-dessous se trouvant dans mlock.c

    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
    20
    21
    22
    23
    /***
    * _unlock - Release multi-thread lock
    *
    *Purpose:
    *       Note that it is legal for a thread to aquire _EXIT_LOCK1
    *       multiple times.
    *
    *Entry:
    *       locknum = number of the lock to release
    *
    *Exit:
    *
    *Exceptions:
    *
    *******************************************************************************/
     
    void __cdecl _unlock ( int locknum )
    {
            /*
             * leave the critical section.
             */
            LeaveCriticalSection( _locktable[locknum].lock );
    }
    pourtant le pointeur existe et bien initialisé avec une adresse (tableau de bool).

    pourtant je fais appel à cet opérateur de multiples fois sans erreur.

    Quelqu'un peut il m'aider ?
    Merci.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En fait, la faute, c'est de libérer un pointeur sans le mettre à NULL alors qu'il continue à être accessible.

    Du coup, au passage suivant, le pointeur n'est toujours pas nul, donc on le delete encore.
    Ceci est un comportement non défini (undefined behaviour) provoque une fin du monde parmi toutes celles possibles, dont:
    • plantage violent
    • cassage de donnée arbitraire
    • formatage du disque dur (pourquoi pas, le comportement n'étant pas défini)
    • rien pour le moment

    Des quatre, la pire étant la dernière, et la première étant ton symptome.


    Au passage, delete ([] ou non) ne fait rien sur un pointeur nul. (que ce soit parce qu'il vaut 0 ou NULL, ou parce qu'il vaut std::nullptr).

    Si possible, passe à nullptr, c'est mieux que NULL (car ce dernier est une MACRO)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(boolfield != NULL)
    {
       delete [] boolfield;
       bootfield = NULL;
    }
    Je pense que tu passes plusieurs fois par ton delete[], du coup tu libères la mémoire une seconde fois (ce qui est illégal) ; ça doit lever une exception ou faire un abort() qui te sort de ton contexte et détruit tes mutex donc appelle unlock(). Pour rappel, delete NULL et delete[] NULL sont autorisés ; toujours affecter NULL à un pointeur après avoir libéré sa mémoire. Ou mieux, ne pas utiliser de pointeurs nus.
    -- Yankel Scialom

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Erreur : entrée dans void __cdecl _unlock (int locknum) VS2012
    Re Bonjour,

    Merci pour vos réponses qui m'ont largement aiguillé sur la solution ou plutôt bug (avant la fin du monde).

    Le pointeur que je veux 'deleter' a été modifié auparavant en y inscrivant une valeur plus qui occupe une plus grande place mémoire avec memcpy().
    L'erreur s'est produite plus loin dans l'opérateur = au moment de supprimer le pointeur (violation du heap local).

    J'ai donc corrigé réussi à corriger le problème.

    Merci encore BEAUCOUP pour vos réponses et votre aide.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    memcpy est à proscrire pour une class !
    A n'utiliser qu'avec des POD pour éviter toute surprise.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. [Drupal] [DRUPAL7] Message d'erreur à l'entrée dans un nouveau site sur un nouvel hébergeur
    Par Jon Shannow dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 19/05/2015, 18h59
  2. [AC-2010] Erreur de type pour une entrée dans une table
    Par touraine dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/12/2012, 13h40
  3. [JNDI] Erreur non explicite lors de l'ajout d'une entrée dans l'AD
    Par elias dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 08/07/2011, 21h48
  4. Erreur d'index sur une List<int> dans boucle for
    Par popoliline dans le forum C#
    Réponses: 13
    Dernier message: 16/06/2010, 11h03
  5. touche entrée dans formulaire
    Par pram dans le forum XMLRAD
    Réponses: 8
    Dernier message: 15/04/2003, 09h13

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