when i try to erase an element from the vector i get an error subscript out of range vector
std::vector users; in my .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;
}
}
i don't know why it crashes ... even if i do users.erase(users.begin()); it doesn't work and i get the same error
There is no need to write so much code since STL already gives you everything you need.
First you can use a std::vector<std::unique_ptr<User>>
and forget about delete this->users[i]
. Then you can use std::find_if
to do the dirty job:
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);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.