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 :

Problème abnormal termination


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 65
    Par défaut Problème abnormal termination
    Bonjour à tous,

    me voilà confronté à un problème très étrange.

    Je crée une fonction Heat() qui est appelée par l'instance d'une classe CTarget dans une boucle while.
    Le code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CTarget Target;
    while(#condition)
    {
      Target.Heat();
    }
    Une partie de la fonction heat() dans la classe CTarget est la suivante :
    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
     
    int CTarget::Heat()
    {
      [...]
      const int nNbCells = 3;
      double** pMat;
      pMat = new double*[nNbCells];
      if (pMat == NULL)
        exit(1);
      for(int j=0;j<nNbCells;j++)
      {
        pMat[j] = new double[nNbCells];
        if (pMat[j]==NULL)
           exit(1);
      }
     
      [...]  // On passe à la fin de la fonction
     
      if (pMat != NULL)
        delete [] pMat;
     
      return 1;
    }
    Le code est compilé, exécuté au moins une cinquantaine de fois (le programme passe donc dans la boucle while une cinquante de fois), puis à un moment donné, il plante et me lance "Abnormal Program Termination".

    Je n'ai pas décrit la fonction Heat() en détail, dans la mesure où le programme s'arrête à cet endroit précis.

    Et je ne comprends pas cette erreur. Quelqu'un a-t-il déjà rencontré le même problème ?

    Je vous remercie par avance pour vos réponses.
    ++

  2. #2
    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
    Par défaut
    Bonjour,
    libère la mémoire allouée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pMat = new double*[nNbCells];
    Mais où est la libération de la mémoire allouée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pMat[j] = new double[nNbCells];
    Il est probable que la 51ème fois, il n'y ait plus de mémoire disponible tout simplement.

    P.S. : quelle bonne raison as-tu de ne pas utiliser ne serait-ce que std::vector pour t'éviter ces soucis ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 65
    Par défaut
    Merci de cette réponse rapide.

    A priori, l'appel à l'opérateur delete avec [] signifie que tous les éléments du tableau, y compris les zones adresses, sont détruits. Je me trompe ? Un seul appel au delete [] ne suffit donc pas ?

    Pour l'utilisation de Vector, je suis plutôt pour coder tout ce qui est codable, malgré le fait que les bibliothèques C++ soient bien faites. Coder l'ensemble des fichiers permet d'avoir un contrôle total sur les erreurs.
    Ironique non ?

    Je vais tester de détruire successivement.
    je vous tiens au courant.

  4. #4
    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
    Par défaut
    Citation Envoyé par ketchupi Voir le message
    Merci de cette réponse rapide.

    A priori, l'appel à l'opérateur delete avec [] signifie que tous les éléments du tableau, y compris les zones adresses, sont détruits. Je me trompe ?
    Oui.
    Citation Envoyé par ketchupi Voir le message
    Un seul appel au delete [] ne suffit donc pas ?
    Non

    delete[] détruit effectivement le tableau et le destructeur de chacun des éléments s'il contient un objet. delete[] appel le destructeur de chaque élément si le tableau contient une classe et libère la mémoire allouée. Et c'est tout. Si le tableau contient un type POD (pointeur, entier, flottant...), pas de destructeur-> seule la mémoire est libérée. Comment diable delete[] pourrait savoir que chaque cellule doit être détruite par un delete simple ou un delete[] à partir d'une simple définition double** ?

    Citation Envoyé par ketchupi Voir le message
    Pour l'utilisation de Vector, je suis plutôt pour coder tout ce qui est codable, malgré le fait que les bibliothèques C++ soient bien faites. Coder l'ensemble des fichiers permet d'avoir un contrôle total sur les erreurs.
    non. La STL fait parti du C++ et est là pour justement ne pas avoir à réinventer la roue. En plus, il y a de grande chance que ton implémentation de la STL ne soit pas buggée, elle
    Sincèrement, l'expérience te montrera que c'est une erreur de vouloir tout coder par soit même. Car 1/tu perds du temps sur des détails qui ne sont pas le coeur du projet, 2/aussi bon sois-tu, tu le feras toujours moins bien que les versions existantes (STL ou boost par expl). Elles sont non seulement issues de codeurs expérimentés - mais après tout tu pourrais être meilleurs qu'eux - mais elles bénéficient surtout de la maturation : utilisées par beaucoup et depuis longtemps, les failles ont de plus grandes chances d'être trouvées et corrigées.

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

Discussions similaires

  1. [WS 2008 R2] Problème connection terminal server avec client seven uniquement
    Par gretch dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 09/06/2011, 14h37
  2. Problème pour terminer un thread
    Par BestFF dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 05/07/2008, 22h03
  3. [FORMS 9i] Abnormal termination of connection
    Par Dox57 dans le forum Forms
    Réponses: 2
    Dernier message: 26/06/2008, 10h23
  4. Problème x-terminal-emulator dans fluxbox
    Par kromartien dans le forum Debian
    Réponses: 1
    Dernier message: 20/01/2007, 16h29

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