私はソケット サーバーを持っています。新しい接続が確立されるたびに、XClient クラスがインスタンス化され、それをマップに挿入しています。タスクマネージャでメモリ使用量を見ています。たとえば、新しい接続が確立されるたびに、プログラムのメモリ使用量が 800kb 増加するとします。そのクラス内には、このクライアントがアクティブかどうかを示す接続変数があります。無限に実行してマップのすべての要素を反復処理するスレッドを作成し、接続された変数が true か false かを確認しています。false の場合、以前にインスタンス化された 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;