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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    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 extrêmement actif

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    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...

  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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    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
    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 ?

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