Чтобы избежать при завершении «утечек» памяти, программа должна убедиться, что завершены все рабочие потоки. Простейший способ выполнить это – закрыть ожидающий сокет. Это приведет к тому, что все имеющиеся вызовы Accept вернут FALSE и потоки завершатся.
try{
g_sListen.Close();
Sleep(340); // ожидание завершения потока
WSACleanup(); // отключение Winsock
}
catch(){
e->Delete();
}
Проблема может возникнуть только в том случае, если поток находится в процессе обработки клиентского запроса. Основному потоку придется предположить, что все рабочие потоки завершились.