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 :

utilisation de delete


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 38
    Points
    38
    Par défaut utilisation de delete
    Bonjour

    Je possede une variable static défini ainsi dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:
    	static CMemBuffer* listPreBuffer[3000];
    et initialisé comme ça au début du .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMemBuffer* CMemBuffer::listPreBuffer[3000];
    Dans une de mes méthode, j'ai l'instruction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i = 0; i < MAXBUFFER; i ++)
    	listPreBuffer[i] = new CMemBuffer(1000000);
    Et une fois que que j'ai utilisé ce dont j'avais besoin, je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete [] listPreBuffer;
    Le compilateur me donne l'avertissement C4154 : deletion of an array expression; conversion to pointer supplied
    Si j'exécute malgré tout mon programme, l'espace mémoire n'est pas libéré.

    Pouvez-vous me dire quel est mon problème ?

    Je vous remercie par avance

  2. #2
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Ce ne serait pas plutôt comme ceci?
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(i = 0; i < MAXBUFFER; ++i)
    	delete listPreBuffer[i];

  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
    Pourquoi n'utilises-tu pas un vecteur ?

    Là, si ton système arrive à court de mémoire en cours de boucle, il y a des chances que ton exécution n'arrive jamais à ton instruction delete[], et tu auras alors des fuites de mémoire.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par oodini Voir le message
    Pourquoi n'utilises-tu pas un vecteur ?

    Là, si ton système arrive à court de mémoire en cours de boucle, il y a des chances que ton exécution n'arrive jamais à ton instruction delete[], et tu auras alors des fuites de mémoire.
    S'il n'y a plus de mémoire pour l'allocation, c'est plus le système en entier qui risque de planter à la place de l'application.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    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
    Tout dépend du coût de la construction de l'objet...
    Boost ftw

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    +1 pour l'utilisation de vector.
    Mais bon, ça c'est de manière générale quand on parle de tableau, ici il y a un autre détail que je n'aime pas : tu stockes des pointeurs, donc tu dois forcément parcourir ton vector pour faire des delete dessus. Et ça, comme tout ce qui touche à la destruction des objets, ça devrait être géré par RAII (exception safety powaaa!).

    Les solutions sont multiples:
    - utiliser un vector de shared_ptr
    - utiliser un boost::ptr_vector
    - mettre le vector dans un objet qui va gérer correctement son cycle de vie

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    il faut faire un delete de ce qu'on a alloué avec "new"

    en l'occurence, tu n'as pas fait new sur ton tableau donc le delete ne doit pas etre appelé... par contre tu dois faire le delete sur tous les elements de ton tableau (puisque tu as utilisé "new")

  8. #8
    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
    oui ton tableau prend 3000 * sizeof(CMemBuffer*) (ou * la taille d'un pointeur).

    A la fermeture du programme, cette taille sera libéré, mais la mémoire allouée par les new sera toujours là.

    Il faut donc parcourir les éléments et les supprimer un à un.



    Mais oui utilise un vector, si tu fais un reserve(3000) au début, ça sera aussi performant qu'un tableau, et pour que ça soit propre à la suppression des éléments :
    http://cpp.developpez.com/faq/cpp/?p...elete_sequence
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

Discussions similaires

  1. utilisation de delete - Arbre Binaire
    Par azman0101 dans le forum Débuter
    Réponses: 1
    Dernier message: 09/01/2011, 18h02
  2. Risque de l'utilisation de cascade delete
    Par Lucas Panny dans le forum SQL
    Réponses: 13
    Dernier message: 02/10/2008, 16h59
  3. utilisation de delete
    Par patmar83 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/06/2008, 23h29
  4. comment utiliser delete * ?
    Par stphmrt dans le forum DB2
    Réponses: 2
    Dernier message: 02/06/2008, 11h14
  5. Réponses: 14
    Dernier message: 02/10/2007, 13h21

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