gpt4 book ai didi

c++ - 套接字和映射的内存泄漏

转载 作者:行者123 更新时间:2023-11-30 04:27:45 25 4
gpt4 key购买 nike

我有一个套接字服务器,每次建立新连接时,都会实例化一个 XClient 类,并将其插入到 map 中。我正在通过任务管理器查看内存使用情况。假设每次建立新连接时,我的程序的内存使用量都会增加 800kb。在那个类中,有一个连接变量,它会告诉我这个客户端是否处于事件状态。我创建了一个线程来无休止地运行并遍历我的 map 的所有元素,我正在检查连接的变量是真还是假。如果它是假的,我(至少我认为我是......)释放先前实例化的 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 实例添加到我的 map 的代码:

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;

最佳答案

你遇到了几个问题,但最主要的是你似乎在线程之间共享一个 map 而根本没有任何同步。这可能会导致各种麻烦。

关于c++ - 套接字和映射的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10670376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com