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

SL & STL C++ Discussion :

for_each et delete..


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut for_each et delete..
    Bonsoir,

    J'aimerais utiliser une boucle for_each pour supprimer les éléments d'un conteneur avant de supprimer ce conteneur mais le delete dans le for_each, il n'aime pas trop... lol

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    vector<champ*> champs;
     
    vector<champ*>::iterator it = champs.begin();
    vector<champ*>::iterator it_end = champs.end();
     
    for_each(it, it_end, delete);
    Erreur de syntaxe, de parenthèse... enfin il doit manquer un truc, j'ai essayé avec delete it ou des trucs de ce genre, mais ca passe pas... c'est possible vous pensez ? ou je parcours avec un for tout simplement...

    Merci
    ++

  2. #2
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Il faut passer soit par un foncteur soit pas une fonction. Mais tu ne peux pas faire comme ca directement car delete n'est pas une fonction, or c'est ce qu'attend for_each. Avec les expressions lamba en C++0X, ca serra beaucoup plus léger à écrire
    "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)

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    delete n'est pas callable...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void champDeleter(champ* ptr)
    {
       delete ptr;
    }
    ...
     
       foreach(it, it_end, champDeleter);
     
    ...

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    D'accord donc pas trop d'intéret d'utiliser un for_each pour supprimer des objets, puisque qu'il faut passer par une "surcouche" pour appeler le delete...

    autant faire un simple for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(it, it != it_end ; it++)
        delete it;
    ??

    Merci
    Bonne soirée

  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
    Par défaut
    Tu es conscient qu'un tel code ne sera pas exception-safe et peut avoir des fuites mémoires ?

  6. #6
    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 loufoque Voir le message
    Tu es conscient qu'un tel code ne sera pas exception-safe et peut avoir des fuites mémoires ?
    ++
    Déjà tu devrais partir d'un vector<shared_ptr<champ> >. Ca se passera beaucoup mieux!

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Mais sinon, il y a toujours checked_delete qui est fait pour ça

  8. #8
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Tu es conscient qu'un tel code ne sera pas exception-safe et peut avoir des fuites mémoires ?
    Ben pourquoi ?

    Le code proposée par italiasky et celui préconisé par la faq fait strictement la même chose non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(it = container.begin(), it != container.end() ; it++)
        delete (*it);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // FAQ
    struct Delete 
    { 
       template <class T> void operator ()(T*& p) const 
       { 
          delete p;
          p = NULL;
       } 
    }; 
     
    ...
       std::for_each(container.begin(), container.end(), Delete()); 
    ...

  9. #9
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Par défaut
    Re,

    ouais enfin moi j'avais oublié le (* ) ce qui est complètement différent du coup...

    Mais pour le code de la FAQ, j'arrive pas bien voir un truc...

    Etant donné que c'est un vector de pointeurs, l'it pointe sur chaque cellule du vector et le Delete() s'applique sur le it et non sur le (*it) non ?
    Ca va pas du coup ?
    Ou alors, au Delete, ce n'est pas l'it qui est transmis ?

    Bref, si quelqu'un pourrait m'expliquer comment fonctionne ce code de la FAQ avec le foncteur...

    En gros, je ne comprends pas très bien cette ligne je crois bien : le (T*& p) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <class T> void operator ()(T*& p) const
    Merci
    ++

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

Discussions similaires

  1. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02
  2. delete en cascade
    Par bruno270579 dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/12/2003, 17h17
  3. fonction postgresql qui delete un enr
    Par access dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/11/2003, 14h44
  4. [requête] DELETE + SELECT
    Par doohan dans le forum Requêtes
    Réponses: 6
    Dernier message: 07/07/2003, 12h27
  5. [langage] delete de fichier
    Par lolive dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2003, 15h04

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