что за гремучая особенность std::erase - при удалении элемента из вектора:
имеется класс
struct s_socket_info
{
SOCKET m_S;
s_socket_info(SOCKET m_S=0)
:m_S(m_S)
{
}
void operator=(const s_socket_info& r)
{
m_S=r.m_S;
}
~s_socket_info()
{
if(m_S)
{
int res=::closesocket(m_S);
}
}
};
к примеру, удаляем какой-то НЕ ПОСЛЕДНИЙ элемент
std::vector<s_socket_info> m_clients;
...
std::vector<s_socket_info>::iterator it=m_clients.find(...);
...
m_clients->erase(it);
1) сначала для старого (стираемого) экземпляра вызывается оператор присваивания (старый хендл затёрся живым, ага)
2) а только потом для старого же экземпляра вызывается деструктор (живой хендл закрылся)
я в осадке, если честно
пришлось вручную сначала закрывать хендл, только потом удалять экземпляр из вектора. И отказаться от деструктора