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 :

Crash à l'exécution sur delete[]


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut Crash à l'exécution sur delete[]
    Bonjour,

    voilà, j'ai un ptit souci à l'exécution de mon appli...

    Voilà où ça se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CHAR* maChaine = new CHAR[nbChar];
    memset(maChaine, 0, strl(maChaine));
    maChaine =...;
    //...
    delete[] maChaine;
    et donc, c'est sur le 'delete[]' que ça plante
    et j'ai une erreur du genre :
    Debug Assertion Failed!

    Program : monAppli.exe
    File : dbgdel.cpp
    Line 52:

    Expression : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)


    Est-ce que quelqu'un pourrait me dire comment ça se fait?
    qu'est-ce que je fais mal?

    Merci

  2. #2
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(maChaine, 0, strl(maChaine));
    strl ne fait pas ce que tu penses, ca cherche le premier charactere 0 de la chaine. Or, tu appelles ca sur une chaine non initialisée
    utilise nbChar a la place

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Euh oups!
    faute de frappe...
    j'utilise 'strlen'...
    ça devrait être bon, non?

  4. #4
    screetch
    Invité(e)
    Par défaut
    non, c'est comme j'ai ecrit
    strlen "calcule" la longueur d'une chaine en fonction de son contenu
    elle ne donne pas la longueur du buffer

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    pour le memset, il faut utiliser le même nombre utilisé pour l'allocation, et pas strlen(). Dans ton cas, c'est nbChar:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CHAR* maChaine = new CHAR[nbChar];
    memset(maChaine, 0, nbChar);
    maChaine =...;
    //...
    delete[] maChaine;
    Car dans ton exemple, strlen(machaine) renvoie une valeur supérieure à nbChar, et du coup le bloc est invalide.

    Par contre, je ne sais pas pourquoi.

    Mais ça, c'est du C. En C++, on utilisera un vector, ou directement une string s'il s'agit de char, ainsi, tous les problèmes de ce genre disparaissent.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par r0d Voir le message
    Car dans ton exemple, strlen(machaine) renvoie une valeur supérieure à nbChar, et du coup le bloc est invalide.

    Par contre, je ne sais pas pourquoi.
    Tout simplement, la mémoire n'étant pas initialisée, le premier caractère nul peut être (très loin) après nbChar.
    Citation Envoyé par r0d Voir le message
    Mais ça, c'est du C. En C++, on utilisera un vector, ou directement une string s'il s'agit de char, ainsi, tous les problèmes de ce genre disparaissent.
    ++

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    ok,
    bah j'ai essayé en mettant nbChar
    bah, ça marche pas mieux

    gggrrrr
    le pire, c'est qu'au départ, j'avais fait sans le memset et ça marchait
    mais là, j'sais pas c'que j'ai fait mais ça marche plus...

    d'autres pistes??


    En ce qui concerne cette utilisation de tableau de char
    ouais, je sais, c'est un peu obsolète
    mais j'dois m'interfacer avec une librairie en C...
    en fait, j'ai une chaîne de type BSTR que je dois mettre dans un tableau d'octets...
    c'est pour ça que je la passe entre deux dans un tableau de char...
    mais y'a pitêtre d'autres solutions,
    j'suis preneuse

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    c_str permet toujours de récupérer une chaîne à la 'C' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       std::wstring str(L"coucou");
       BSTR bstr = SysAllocString(str.c_str());
       SysFreeString(bstr);
    A tout hasard, à quoi ressemble la suite de

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Alors, pour donner plus de détails, j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    octet *data;
    data = new octet[nbChar];
    CComVariant DataValue;
     
    CComBSTR S(DataValue.bstrValue);
    CHAR* maChaine = new CHAR[nbChar];
    memset(maChaine, 0, nbChar);
    maChaine = W2A(S);
    memcpy(&data, maChaine, nbChar);
    delete[] maChaine;
    Bon, c'est clair, que c'est un joyeux bordel...
    j'suis trop une buse en C/C++...

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    = sur des pointeurs copie l'adresse et non la valeur !
    Donc ce devrait être une copie et non une affectation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    octet *data;
    data = new octet[nbChar];
    CComVariant DataValue;
     
    CComBSTR S(DataValue.bstrValue);
    strncat(data, W2A(S), nbChar-1);
    Ou carrément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string data;
    CComVariant DataValue;
    /* [...] */
    CComBSTR S(DataValue.bstrValue);
    data = W2A(S);

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 94
    Points : 66
    Points
    66
    Par défaut
    au passage un article sur les memset

    http://blog.emmanueldeloget.com/inde...89-c-et-memset

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Ah ouais,
    c'est clair que c'est vachement plus simple
    merci 3DArchi

    et en fait, j'crois que ça venait d'une variable mal initialisée avant
    ppfff, des fois pour voir d'où ça vient, c'est sioux...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/01/2008, 10h55
  2. Problème d'exécution sur un OnMouseWheel
    Par Omeggg dans le forum Composants VCL
    Réponses: 7
    Dernier message: 15/04/2006, 19h24
  3. Réponses: 21
    Dernier message: 14/04/2006, 09h30
  4. [VBA-E]Arrêt d'exécution sur une requette d'enregistrement
    Par thierry27 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/02/2006, 19h53
  5. Exécutable sur un autre PC
    Par Yphon dans le forum Langage
    Réponses: 6
    Dernier message: 13/01/2006, 22h33

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