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

Windows Discussion :

problème delete tableau


Sujet :

Windows

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut problème delete tableau
    j'ai donc un problème lors de ma suppression de mes tableaux. J'obtiens le message d'erreur suivant dans le débugger Visual 2005 : windows has triggered a breakpoint in application.exe.
    This may be due to a corruption of the heap, and indicates a bug in application.exe or any of the DLLs it has loaded.
    Si je choisis continuer, j'ai un autre message : debug assertion failed!
    Je supprime mes tableaux avec la commande : delete [] tab; je crée mes tableaux avec la commande : float *tab; j'initialise mes tableaux avec la commande : tab = new float[nb].
    J'initialise mes tableaux dans le constructeur de ma classe et je les détruis dans le destructeur.
    J'ai une centaine d'instances de ma classe que je détruis toutes les unes après les autres.
    L'erreur ne survient pas dès le début mais après un certain nombre de destructions. Est ce quelqu'un a une idée?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Typiquement un débordement de tableau ou une erreur de pointeur qui est allée pourrir le tas.
    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 Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Est-ce que tu utilises l'opérateur = sur tes class typiquement A a1,a2; <..>a1=a2; ?

    Si oui est-ce que tu as définis le constructeur par recopie ? Il se peut que tu cherches à désallouer quelque chose déja désalloué..;

    Aprés avoir désalloué il faut mettre le pointeur à NULL et avant de libérer il faut regarder si ce pointeur ne vaut pas NULL...
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Non, la plupart du temps je ne manipule que des pointeurs. Je ne fais jamais de recopie avec =. j'utilise toujours un constructeur définit.



    Voila un exemple d'un cas ou j'ai une erreur:



    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    /**
    
     * Charge le dictionnaire de fonts
    
     */
    
    bool
    
    ChargeDico(HWND hDlg)
    
    {
    
      // On prend la main sur le dictionnaire.
    
      HANDLE hFile;
    
      // Si erreur de fichier
    
      if((hFile = CreateFile(
    
            "Fonts/Fonts.dico",
    
            GENERIC_READ,
    
            FILE_SHARE_READ,
    
            NULL,
    
            OPEN_EXISTING,
    
            0,
    
            NULL      
    
        )) == INVALID_HANDLE_VALUE)
    
      {
    
    	return false;
    
      }
    
    
    
      short count;
    
      
    
      // On récupère le nombre de fonts dans le dictionnaire
    
      if (!LireMorceau(hFile, (void*)&count, sizeof(short)))
    
      {
    
        CloseHandle(hFile);
    
        return false;
    
      }
    
    
    
      short tailleAlire;
    
    
      for (int i = 0; i<count; ++i)
    
      {
        // On récupère la taille en octets du nom de la font
    
        if (!LireMorceau(hFile, (void*)&tailleAlire, sizeof(short)))
    
        {
    
          CloseHandle(hFile);
    
    	  return false;
    
        }
    
    
        char* nom_ft = new char[tailleAlire + 1];
    
    
    	// On récupère le nom de la font
    
        if (!LireMorceau(hFile, (void*)nom_ft, tailleAlire))
    
        {
    
          CloseHandle(hFile);
    
    	  return false;
    
        }
    
    	SendDlgItemMessage(hDlg,IDC_LST_DICO,LB_ADDSTRING,0,(LPARAM)nom_ft);
    
        delete [] nom_ft;
    
      }
    
    
    
      CloseHandle(hFile);
    
      return true;
    
    }


    Je suis obligé de remplacer par ça :



    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    /**
    
     * Charge le dictionnaire de fonts
    
     */
    
    bool
    
    ChargeDico(HWND hDlg)
    
    {
    
      // On prend la main sur le dictionnaire.
    
      HANDLE hFile;
    
      // Si erreur de fichier
    
      if((hFile = CreateFile(
    
            "Fonts/Fonts.dico",
    
            GENERIC_READ,
    
            FILE_SHARE_READ,
    
            NULL,
    
            OPEN_EXISTING,
    
            0,
    
            NULL      
    
        )) == INVALID_HANDLE_VALUE)
    
      {
    
    	return false;
    
      }
    
    
    
      short count;
    
      
    
      // On récupère le nombre de fonts dans le dictionnaire
    
      if (!LireMorceau(hFile, (void*)&count, sizeof(short)))
    
      {
    
        CloseHandle(hFile);
    
        return false;
    
      }
    
    
    
      short tailleAlire;
    
      char nom_ft[MAX_PATH];
    
      ZeroMemory(nom_ft,sizeof(nom_ft));
    
      for (int i = 0; i<count; ++i)
    
      {
    
        // On récupère la taille en octets du nom de la font
    
        if (!LireMorceau(hFile, (void*)&tailleAlire, sizeof(short)))
    
        {
    
          CloseHandle(hFile);
    
    	  return false;
    
        }
    
    
    
    	// On récupère le nom de la font
    
        if (!LireMorceau(hFile, (void*)nom_ft, tailleAlire))
    
        {
    
          CloseHandle(hFile);
    
    	  return false;
    
        }
    
    	SendDlgItemMessage(hDlg,IDC_LST_DICO,LB_ADDSTRING,0,(LPARAM)nom_ft);
    
      }
    
    
    
      CloseHandle(hFile);
    
      return true;
    
    }


    Dans ce cas là ça ne me gène pas trop mais ailleurs je ne peux pas contourner...

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1. Pas de cast en void*, ça ne sert à rien.
    2. Pas de cast C-style en C++, c'est la porte ouverte aux erreurs.
    3. sizeof(variable) est plus conseillé que sizeof(type) (ainsi, si tu changes le type de la variable, tu n'as qu'un seul changement à faire).
    4. Tu n'as pas l'air de t'assurer que la chaîne est zéro-terminée...
    5. Ta ListBox est bien réglée pour stocker la chaîne et non le pointeur ?
    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.

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    merci de ta réponse,
    Citation Envoyé par Médinoc
    1. Pas de cast en void*, ça ne sert à rien.
    2. sizeof(variable) est plus conseillé que sizeof(type) (ainsi, si tu changes le type de la variable, tu n'as qu'un seul changement à faire).
    Ok merci pour les conseils, je n'en étais pas vraiment conscient.

    Citation Envoyé par Médinoc
    1. Pas de cast C-style en C++, c'est la porte ouverte aux erreurs.
    2. Tu n'as pas l'air de t'assurer que la chaîne est zéro-terminée...
    3. Ta ListBox est bien réglée pour stocker la chaîne et non le pointeur ?
    Pour ces trois remarques je ne sais pas quoi répondre, qu'entends-tu par cast C-style, je n'ai jamais appris le C donc dans les codes que je récupère sur le net je considère tout comme C++. (mis à part malloc et free que je ne fais jamais)

    Comment s'assure-t-on que la chaîne est zero terminée ?

    Je ne savais pas qu'une listbox pouvait contenir un pointeur lorsqu'on envoi le message ADDSTRING. Comment savoir si c'est le cas ?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1. (void*)nom_ft et (LPARAM)nom_ft sont des casts C-style.
      reinterpret_cast< LPARAM >(nom_ft) est un cast C++ correct. D'accord c'est plus long, mais il faut faire un effort, car ces casts sont beaucoup moins permissifs et peuvent aider à détecter des erreurs
      (les casts C++ statiques sont static_cast<>(), reinterpret_cast<>() et const_cast<>(). Le dynamic_cast<>() est un cas à part).
    2. De base, nom_ft[tailleAlire] = '\0'; serait un bon début.
    3. Par défaut, une ListBox stocke la chaîne. Si tu ne joues pas avec le style OwnerDraw, ça devrait aller.
    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.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    effectivement, j'avais bien un problème d'écriture en-dehors des tableaux, pas l'exemple donné mais ailleurs, que j'ai corrigé.
    Je peux donc maintenant faire mes delete de tableaux sans problème.
    J'ai un autre problème avec des pointeurs de pointeurs. Le but est d'avoir un tableau de nchaines de caractères :
    j'instancie mon tableau comme ça char ** sschaine = new char* [n];
    char * chaine = new char[n2];

    ...
    sschaine[i] = chaine;

    ...
    delete [] sschaine[i];
    En faisant mes delete de cette manière avec i=0, pas de problème, mais pour i>0 mes pointeurs ne sont alors plus valides.
    Faut il seulement faire un delete général du style delete char [] chaine;ou encore delete char [][] sschaine;

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pas le choix, il faut un delete pour chaque new.
    Et conseil: N'oublie pas d'initialiser les pointeurs du tableau, si tu ne les alloues pas immédiatement.
    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.

Discussions similaires

  1. Problème delete[] tableau 2D
    Par jesclaine dans le forum C++
    Réponses: 11
    Dernier message: 23/03/2010, 14h21
  2. [XHTML] problème de tableau
    Par virgul dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 28/04/2005, 07h18
  3. Problème de tableau
    Par tom06440 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 26/04/2005, 20h30
  4. Problème de tableau
    Par krfa1 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 08/02/2005, 11h09

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