2015-10-11 3 views
1

lorsque je tente d'effacer un élément du vecteur je reçois une erreur d'indice de vecteur de gammeIndice hors de portée C++ vecteur effacer

utilisateurs std :: vecteur; dans mon .hh

void Server::read_client(int socket) 
{ 
int  ret; 
int  size; 
char buff[255]; 
std::string data = "Hello, world!"; 

size = 255; 
ret = recv(socket, buff, size, 0); 
if (ret == 0 || ret == SOCKET_ERROR) 
{ 
    std::cout << "Client [" << socket << "] disconnected." << std::endl; 

    for (int i = 0; i < this->users.size();) 
    { 
     if (this->users[i]->getId() == socket) 
     { 
      std::vector<User *>::iterator iter; 
      /*for (iter = this->users.begin(); iter != this->users.end();) 
      { 
       if ((*iter)->getId() == socket) 
       { 
        delete *iter; 
        closesocket(socket); 
        this->users.erase(iter); // crash here 
        return; 
       } 
       else 
        iter++; 
      }*/ 
      closesocket(socket); 
      delete this->users[i]; 
      this->users.erase(this->users.begin() + i); // crash here 
      return; 
     } 
     else 
      i++; 
    } 
    return; 
} 
} 

je ne sais pas pourquoi il se bloque ... même si je ne users.erase (users.begin()); cela ne fonctionne pas et je reçois la même erreur

+0

S'il vous plaît donner un (https://stackoverflow.com/help/mcve) [MCVE] –

Répondre

1

Il n'est pas nécessaire d'écrire autant de code puisque STL vous donne déjà tout ce dont vous avez besoin. D'abord vous pouvez utiliser un std::vector<std::unique_ptr<User>> et oublier delete this->users[i]. Ensuite, vous pouvez utiliser std::find_if pour faire le sale boulot:

std::vector<std::unique_ptr<User>> users; 

int socket = ...; 
auto it = std::find_if(users.begin(), users.end(), [socket](const std::unique_ptr<User>& user) { return user->getId() == socket; }); 
users.erase(it);