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
    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

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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)

  3. #3
    Membre Expert
    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 : 38
    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
    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.

  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
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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