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 :

std::list remove & delete


Sujet :

SL & STL C++

  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut std::list remove & delete
    Bonjour

    J'ai un soucis les gars
    Note: Ne faites pas attention au côté SDL le problème que j'ai est relatif aux listes chaînées.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Uint32 move_world (Uint32 iv, void *arg){
        std::list<Sprites::CRocket*> rockets = Player->getRockets();
        std::list<Sprites::CRocket*>::iterator iter;
        std::list<Sprites::CShooter*>::iterator shiter;
     
        Uint32 *t = (Uint32*) arg;
        SDL_Delay (*t);
     
        if (!Pause){
            bg->blitImage(screen);
     
            Player->move();
            Player->blitImage(screen);
     
            for (shiter=shooters.begin(); shiter != shooters.end(); ++shiter){
                (*shiter)->move();
                (*shiter)->blitImage(screen);
            }
     
            for (iter=rockets.begin(); iter != rockets.end(); ){
                Sprites::CRocket* r = *iter;
     
                if (!r->canMove()){
                    iter = rockets.erase(iter);
                    rockets.remove(r);
                    delete r;// ############### PROBLEME###############
                }
                else
                {
                    (*iter)->move();
                    (*iter)->blitImage (screen);
                    ++iter;
                }
            }
     
            SDL_Flip (screen);
        }
     
        return iv;
    }
    Donc comme montré dans le code, mon delete foire. j'ai un seg fault et je ne omprend pas pourquoi. Si j'enlève le delete là ça marche mais par contre les objets restent en mémoires et je veux pas ça !
    J'ai réalisé que le .remove() ne détruit pas l'objet, alors comment faire exactement ? Je m'y prend mal ?

    Merci
    Compil your life guy!
    The Aures Project

  2. #2
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (!r->canMove()){
                    iter = rockets.erase(iter);
                    rockets.remove(r);
                    delete r;// ############### PROBLEME###############
    Déjà, effectivement il faudra que tu ais un delete quelque part car, comme tu le sais sûrement, si tu stockes des pointeurs dans ton containeur, erase ou remove ne libéreront pas la mémoire.

    Déjà premier problème que je semble voir, la fonction erase te renvoie un itérateur vers l'élément qui suit celui qui a été détruit. C'est bien ce que tu souhaitais faire ?

    Ensuite, je ne pense pas qu'il soit nécessaire de faire un remove ET un erase... La fonction remove permet de supprimer toutes les valeurs qui ont la valeur que tu passes en paramètre, alors qu'erase te permet de supprimer juste la valeur pointé par l'itérateur.

    En faisant juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!r->canMove()){
                    iter = rockets.erase(iter);
                    delete r;//
    Est-ce que ça marche ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/01/2010, 01h03
  2. [C++][std::list] Reinterpret cast
    Par chronos dans le forum SL & STL
    Réponses: 7
    Dernier message: 18/08/2005, 17h04
  3. [dev-C++]std::list<tree_node<T>*> iterator;
    Par jmv dans le forum Dev-C++
    Réponses: 7
    Dernier message: 06/05/2005, 13h14
  4. acceder au n iéme element d'une liste std::list
    Par sorari dans le forum SL & STL
    Réponses: 4
    Dernier message: 23/03/2005, 15h21
  5. [std::list][find_if] problème avec mes foncteurs
    Par n!co dans le forum SL & STL
    Réponses: 12
    Dernier message: 04/02/2005, 11h56

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