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 :

[tableau] Delete[] impossible sur tableau d'une classe


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut [tableau] Delete[] impossible sur tableau d'une classe
    Bonjour a tous,

    Je n'arrive pas a comprendre la raison qui fait que le compilateur plante lorsque je cherche a désallouer la mémoire.

    J'ai voulu créer un tableau d'objet (volontairement sans utiliser la classe vector), pour cela je crée un pointeur sur ma classe et je la dimensionne sans probleme, mais au moment de la suprrimer le delete plante sans que j'en saisisse la raison...

    Voici le code:
    Code Point.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Point
    {
    private :
        long x,y;
    public:
        Point(void);
        ~Point(void);
    }
    Code main.cpp : 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
    #include "Point.h"
    #include <string>
     
    using namespace std;
     
    int main(void)
    {
    Point * pMap;
    long lSize;
    string stErrMsg("");
     
        if (!GetMapSize(lSize,stErrMsg))
            return PromptErrMsg(stErrMsg);
     
        pMap=new Point[lSize];
        if (pMap==NULL)
            return 0;
     
     
    /* tout un code dummy pour initialiser le tableau de points
     et faire ce que je veux avec */
     
        delete[] pMap;
     
        return 1;
    }

    Je ne comprends pas pourquoi mon code est rejeté. =(
    En débuguant en pas a pas, j'ai bien que pMap est différent de NULL avant le delete. Il me semble être cohérent avec l'idée d'allocation et désallocation et surtout être syntaxiquement correct.
    Juste pour avancer un peu j'ai taché de remplacer delete[] par delete et ça plante de la même manière.

    Est ce que quelqu'un aurait une idée de l'origine de mon erreur? =(

    Merci pour vos réponses (ou du moins vos lectures)

    E.G

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Faudrait voir ce que fait le code "dummy", il doit y avoir quelque chose de pas net :-)

    Si tu enlève le code "dummy" il y a toujours l'erreur ?

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pMap=new Point[lSize];
        if (pMap==NULL)
            return 0;
    Le if est inutile, en cas d’échec de l'allocation, new lance une exception.
    Sauf compilateur très anciens mais dans ce cas là autant changer de compilateur.

    Si tu veux vraiment que new retourne NULL, utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pMap = new (std::nothrow) Point[Size]
    Cf cppreference

  4. #4
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    Salut,
    Merci pour vos réponses.

    Alors Joker Eph, lors de mes investigations j'avais commenté tout le bloc dit Dummy. et rien n'y faisait. =(
    Et encore plus étrange, ce matin je réessaie sans rien changer a mon code et ça passe sans erreur. Le pointeur est bien desalloué etc... je ne comprends pas vraiment ce qui a pu arriver. Et surtout ne laisse présager rien de bon sur mon code :-/
    Je continue a chercher l'origine du problème...

    Merci NeckAra, je gèrerai maintenant l'erreur d'allocation avec un try{} catch(badalloc){} .

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Plusieurs remarques sur le code:
    - il est inutile d'initialiser une std::string avec une chaîne vide, le constructeur par défaut le fera
    - à l'inverse, il peut être intéressant d'initialiser un pointeur avec NULL (ou nullptr), un delete sur null n'aura aucun effet
    - la déclaration des variables ne devrait être faite que lors de son utilisation, il n'est pas nécessaire de les déclarer toutes en début de bloc (ceci est une ancienne façon de faire en C)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. [Débutant] Instancier un tableau sur base d'une class
    Par paintbox dans le forum VB.NET
    Réponses: 22
    Dernier message: 03/11/2011, 08h04
  2. tableau de combobox et textbox dans une classe
    Par hamedi1 dans le forum C#
    Réponses: 1
    Dernier message: 08/02/2010, 17h22
  3. Réponses: 1
    Dernier message: 22/12/2009, 11h40
  4. Tableau de structure en C et une classe en C#
    Par Mouti dans le forum C++/CLI
    Réponses: 6
    Dernier message: 10/07/2007, 07h55
  5. Réponses: 2
    Dernier message: 06/09/2006, 23h20

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