Problème avec la classe vector

Problème avec la classe vector - C++ - Programmation

Marsh Posté le 11-10-2004 à 13:21:29    

salut les gens
 
j'ai un code du genre :
 
vector <client> Clients;
 
int main()
{
  std::vector<client>::iterator id;
 
  while(1)
  {
    for(id = Clients.begin(); id != Clients.end(); ++ id)
    {
      if(id->sock->eof())
      {
        delete id->sock;
        Clients.erase(id);
        continue;
      }
 
      parsemsg(*id->sock);
    }
  }
}
 
client est une structure à moi, avec dedans une classe clSocket de ma composition qui gère la connexion.
parsemsg est une fonction qui va chercher les paquets, tout ca.
 
Le problème est que le programme segv dès que le client déco, dans clSocket::eof()
c'est comme si le vecteur avait effectivement supprimé la structure correspondante, mais sans mettre à jour begin() et end(); il continue à regarder si le socket qu'on a déjà fermé contient des données...
 
Enfin je m'arrête là, j'ai l'impression d'embrouiller les choses plus que d'expliquer...
 
Système : Linux hermes 2.6.8.1 #4 Mon Oct 4 09:51:32 CEST 2004 i686 Celeron (Coppermine) GenuineIntel GNU/Linux
Compilateur : gcc version 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)
(infos au cas ou, je pense que ca vient plutot de mon code)
 
merci d'avance pour toute aide
 
mad:: prog

Reply

Marsh Posté le 11-10-2004 à 13:21:29   

Reply

Marsh Posté le 11-10-2004 à 13:55:35    

Si, il met à jour begin() et end(), mais pas ton itérateur.  
 
Il te faux donc récupérer la valeur de retour de erase(), qui est la nouvelle position de ton itérateur.
 
Classiquement:

Code :
  1. while(it!=Client.end())
  2. {
  3.      if(id->sock->eof())
  4.       {
  5.         delete id->sock;
  6.         id = Clients.erase(id);
  7.       }
  8.       else
  9.       {
  10.         parsemsg(*id->sock);
  11.         ++id;
  12.       }
  13. }

Reply

Marsh Posté le 11-10-2004 à 13:57:55    

ah ok, tout simplement :)
 
le truc c'est que j'ai pas de doc :( et encore moins en amphi, vu que j'ai pas de net non plus
 
merci encore !
 
mad:: prog

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed