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

Visual C++ Discussion :

crash et Access violation


Sujet :

Visual C++

  1. #1
    Membre �clair�
    Inscrit en
    Mars 2006
    Messages
    274
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Par d�faut crash et Access violation
    comment savoir directement la variable qui a cree une exception dans le code en lisant le message d'erreur?
    je pense que ce bout de code qui m'a cree une exception. et le programme crash directement.
    en faisant un debug j'ai trouv� que les dernieres instructions ex�cut� sont ce bout de code.

    est ce qu'il y a un autre moyen de liberer la memoire allou�e pour la variable ch?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *ch;
    WCHAR *pStr2;
     
    for (int i =1; i<1000;i++)
    {
    ch =new char[string(OLE2T(pStr2)).length() + 1];
    memset(ch, '\0', string(OLE2T(pStr2)).length() + 1);
    memcpy(ch, string(OLE2T(pStr2)).begin(), string(OLE2T(pStr2)).length());
    printf("%s\n",ch);
    delete(ch);
    }

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    J'ai des doutes l�-dessus:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    memcpy(ch, string(OLE2T(pStr2)).begin(), string(OLE2T(pStr2)).length());
    Tu cr�es deux strings diff�rentes, l�, non?

    Ne serait-il pas plus prudent de cr�er une fois pour toute la string dans ton it�ration?

    De plus, OLE2T n'est pas la bonne macro pour les types que tu utilises.
    Si tu veux vraiment convertir de WCHAR char, tu dois utiliser W2A...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre �clair�
    Inscrit en
    Mars 2006
    Messages
    274
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Par d�faut
    merci pour ta rapide reponse.
    le probleme c'est que ptr2 change pour chaque iteration (bon la boucle for est mal plac�e mais ptr2 est lue � chaque iteration.
    a ton avis quelle est la meilleur fa�on de convertir wchar en char

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    G�n�ralement, j'utilise directement les fonctions de conversion de l'API Win32 : WideCharToMultiByte() notamment...

    Ou bien si on veut utiliser du C++ standard, un std::ostringstream dans lequel on ins�re une std::wstring, �a marche...
    Ou encore, toujours en C++ standard, il y a quelque part une classe template qui contient des fonctions narrow() et widen()...

    PS: J'ai dit une fois pour toutes dans ton it�ration, pas une fois pour toutes dans ta boucle...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre �clair�
    Inscrit en
    Mars 2006
    Messages
    274
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Par d�faut
    je te remercie pour ton aide.
    j'ai trouv� cette fonction "wcstombs" qui m'as resolu le probleme de crash.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    size_t pStr2_size;	
    char *ch           ;
    pStr2_size = wcslen(pStr2) + 1;
    ch =new char[pStr2_size];
    wcstombs(ch, pStr2, pStr2_size);

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    ERREUR.

    Tu ne dois pas utiliser directement la taille de la cha�ne d'origine pour la cha�ne de destination.
    Tu dois appeler deux fois wcstombs() (la premi�re fois avec NULL en destination), et utiliser comme taille le r�sultat du premier appel.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre �clair�
    Inscrit en
    Mars 2006
    Messages
    274
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Par d�faut
    C'est � dire? comment �a devient cet exemple?
    car j'ai mis �a
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    pStr2_size=wcstombs(NULL, pStr2, pStr2_size);
     
    ch =new char[pStr2_size];
     
    wcstombs(ch, pStr2, pStr2_size);
    et les chaines sont tronqu�es( le debut c bon et le reste de la chaine des caracteres inconnus(illisibles)

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Tu oubliais le z�ro terminal ET tu passais un pointeur non-initialis�...

    Un truc de ce genre devrait marcher :
    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
    24
    25
    26
    27
    28
    29
    30
    #include <cassert>
    #include <cstdlib>
     
    //...
     
    {
    	//Taille du buffer: Valeur retournée par wcstombs + zéro terminal.
    	size_t cchLengthA = wcstombs(NULL, pStr2, 0);
    	size_t cchSizeA = cchLengthA+1;
     
    	//Allocation
    	char *sDest = new char[cchSizeA];
     
    	//Conversion
    	int res = wcstombs(sDest, pStr2, cchSizeA);
    	if(res != cchLengthA)
    	{
    		//Erreur.
    		std::cout << "Erreur de conversion" << std::endl;
    	}
    	else
    	{
    		//Conversion terminée.
    		std::cout << "Converti : \"" << sDest << "\"" << std::endl;
     
    		//Vérification avec une assertion :
    		//La condition devrait TOUJOURS être vraie.
    		assert(sDest[cchLengthA] == '\0');
    	}
    }
    Glossaire: cch = compte de caract�res (par opposition � cb = compte d'octets)
    Length (longueur) = taille de la cha�ne, sans z�ro terminal.
    Size (taille) = taille de la cha�ne avec z�ro terminal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre �clair�
    Inscrit en
    Mars 2006
    Messages
    274
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Par d�faut
    ok �a marche
    mais quelle est la difference entre utiliser :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    pStr2_size = wcslen(pStr2) + 1;
    et utiliser :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    size_t cchLengthA = wcstombs(NULL, pStr2, 0);
    size_t cchSizeA = cchLengthA+1;

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    La diff�rence :
    C'est garanti marcher, m�me avec une page de code double-byte.

    Avec ton code, si UN SEUL des caract�res doit se coder sur deux octets (caract�res orientaux, notamment) dans la page de code courante, c'est le d�passement de buffer garanti.
    Microsoft nous propose un moyen de faire marcher � coup s�r, pourquoi s'en priver?

    Derni�re minute : De plus, wcstombs est aussi disponible sur les OS unixo�des, et beaucoup de Linux sont en UTF-8 de nos jours (et en UTF-8, BEAUCOUP de caract�res prennent deux octets, � commencer par nos accents...).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre �clair�
    Inscrit en
    Mars 2006
    Messages
    274
    D�tails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Par d�faut
    Je vous remercie enormement pour toutes vos explications.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Trouver l'origine d'un crash access violation
    Par Franck0 dans le forum C++/CLI
    R�ponses: 3
    Dernier message: 04/04/2013, 11h13
  2. R�ponses: 7
    Dernier message: 22/02/2005, 13h07
  3. [DELPHI][PROECEDURES STOCKES] Access violation
    Par All Jinx dans le forum Bases de donn�es
    R�ponses: 6
    Dernier message: 14/05/2004, 15h57
  4. Crash Base Access
    Par Ronald G. dans le forum Access
    R�ponses: 4
    Dernier message: 04/08/2003, 11h55
  5. R�ponses: 3
    Dernier message: 22/05/2002, 09h37

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