我有一个套接字服务器,每次建立新连接时,都会实例化一个 XClient 类,并将其插入到地图中。我正在通过任务管理器查看内存使用情况。例如,每次建立新连接时,我的程序的内存使用量都会增加 800kb。在该类中,有一个连接变量,它将告诉我这个客户端是否处于活动状态。我创建了一个线程来无休止地运行并遍历我的地图的所有元素,并且我正在检查连接的变量是真还是假。如果它是假的,我(至少我认为我是......)释放先前实例化的 XClient 类使用的内存。但是,内存使用量仅减少了 800kb 的一半(例如,没有精确值)。因此,当客户端连接时:+800kb。当客户端断开连接时:-400kb。我想我有内存泄漏?如果我连接了 100 个客户端,那么未释放的 400kb 将变成 4000kb 的未使用(?)内存,这将是一个问题。
所以,这是我的代码。遍历所有元素的线程:
DWORD Update(XSockets *sockets)
{
while(true)
{
for(sockets->it = sockets->clients.begin(); sockets->it != sockets->clients.end(); sockets->it++)
{
int key = (*sockets->it).first;
if(sockets->clients[key]->connected == false) // remove the client, releasing memory
{
delete sockets->clients[key];
}
}
Sleep(100);
}
return true;
}
将新 XClients 实例添加到我的地图的代码:
bool XSockets::AcceptConnections()
{
struct sockaddr_in from;
while(true)
{
try
{
int fromLen = sizeof(from);
SOCKET client = accept(this->loginSocket,(struct sockaddr*)&from,&fromLen);
if(client != INVALID_SOCKET)
{
srand(time(NULL));
int clientKey = rand();
XClient* clientClass = new XClient(inet_ntoa(from.sin_addr),clientKey,client);
this->clients.insert(make_pair(clientKey,clientClass));
}
Sleep(100);
}
catch(...)
{
printf("error accepting incoming connection!\r\n");
break;
}
}
closesocket(this->loginSocket);
WSACleanup();
return true;
}
和声明:
map<int,XClient*> clients;
map<int,XClient*>::iterator it;