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 :

Un delete propre


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut Un delete propre
    Bonjour,

    Je m'interroge sur la meilleure façon de faire un delete propre de la classe suivante (j'ai simplifié la classe pour l'exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class A
    {
       A();
       ~A();
     
       int tbl[100][4];
       char label[50]
       float *param;
       int value;
     
    }
    Je pensais à la fonction suivante mais la section start/stop provoque un sérieux bug à l'exécution (identique si j'écris tbl à la place de &tbl : ça passe à la compil, mais plante à l'exécution). Si j'ôte cette section, la mémoire n'est pas restituée, ce qui est bien gênant ....
    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
     
    A::~A()
    {
     
       int j;
     
    // start
       for (j=0; j<4, j++)
         delete[] &tbl[j]
     
       delete[] &tbl;   
    // stop
     
       delete[] label;
       delete param;   
    }
    Christian

  2. #2
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par coberle Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class A
    {
       A();
       ~A();
     
       int tbl[100][4];
       char label[50]
       float *param;
       int value;
     
    }
    on ne delete uniquement les variables que l'on alloue, dans ton cas, tbl et label sont des données qui ont été automatiquement allouée lors de la création de ta classe (car membre de ta classe). Lors de sa destruction, elle seront donc automatiquement désallouée. Cela signifie aussi que tu n'as pas besoin d'allouer de la mémoire pour les membres tbl label

    par contre si tu as un pointeur comme membre de ta classe (ici param par exemple) si jamais tu lui alloue de la mémoire en utilisant malloc ou new, il te faudra désalloue cette mémoire quand tu détruiras ta classe en faisant free ou delete.

    Pour conclure, on ne free/delete que les pointeurs que l'on a précédemment allouer avec malloc/new (faut avoir le même nombre de free/delete et de malloc/new). Tu as un outil qui est génial pour détecter ce genre de problème: Valgrind. C'est trés utile pour détecter les fuite de mémoire.

    Aurélien

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Comme dit Aurelien Tran, seul param peut poser problème.

    A toi de gérer intelligemment l'allocation/désallocation de la mémoire selon l'initialisation et utilisation de param.

    Jeter un oil aux poitneurs intelligents (smart pointers) : auto_ptr, shared_ptr...

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Utilise delete quand la mémoire allouée est avec new, et delete[] quand elle a été allouée avec new[].

    N'utilise pas de pointeurs et tu pourras te contenter des destructeurs, opérateurs d'affectation et constructeur de copie par défaut.
    Boost ftw

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    et utilise des std::string à la place des tableaux de char, et des std::vector et autres containers pour les tableaux en général.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Il me semble que Valgrind n'est utilisable que sur Linux n'est-ce pas ?

    Sinon tu peux faire un gestionnaire de mémoire, ou en télécharger un. Généralement ils sont composé de 4 fichiers. 2 fichier pour le gestionnaire, c'est une classe capable d'allouer et désallouer mais surtout qui enregistre dans un tableau les allocations et les supprimes lors des libérations. A la fin d'exécution du programme, ce qui reste enregistré dans le gestionnaire sont les blocs qui n'ont pas été alloué.

    Ca fournit également un fichier pour rediriger les opérateurs new new[], delete delete[] et les fonctions malloc, calloc et realloc vers le gestionnaire en y rajoutant le fichier source et la ligne d'appel de l'allocation via des macros.
    Puis un dernier fichier pour désactiver la redirection du gestionnaire en désactivant les macros.

    Pour bien comprendre, fait le toi même en t'aidant des travaux de Laurent (http://loulou.developpez.com) ou télécharge celui de Paul Nettle à l'adresse http://www.paulnettle.com/
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  7. #7
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Méfies toi des constructeur de recopie et de l'operateur d'affectation sur une telle classe.
    En effet, si ta copie se contente de copier le pointeur, tu peux donc avoir plusieurs instances possédant un pointeur pointant vers le même emplacement mémoire.

    Lors de la destruction d'une de ces instances, le delete sur le pointeur fait son boulot mais tu te retrouve avec des instances dont les pointeurs sont invalides. Si tu détruit une autre instance tu va droit à la segmentation fault.

    De manière générale évites les pointeurs nus et privilégies les smart pointeurs. ou prend des mesures drastiques sur la copie d'une classe (la rendre non copiable --> recopie et affectation en private et sans corps, ne pas copier les pointeurs, etc)
    Linux > *

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/12/2008, 14h23
  2. Réponses: 15
    Dernier message: 04/01/2007, 12h15
  3. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 12h02
  4. [requête] DELETE + SELECT
    Par doohan dans le forum Requêtes
    Réponses: 6
    Dernier message: 07/07/2003, 13h27
  5. [langage] delete de fichier
    Par lolive dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2003, 16h04

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