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

标签 c++ sockets memory dictionary memory-leaks

我有一个套接字服务器,每次建立新连接时,都会实例化一个 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/

相关文章:

c++ - 如何在 C++ 中快速解析空格分隔的 float ?

C++ 逗号运算符重载和引用 vector

Python socket.close() 在脚本退出之前不起作用

c++ - 静态内存实例中的字符串计数

javascript - Node.js:新版本中存在严重的内存泄漏错误?

c# - 在 ushort 中设置位范围

c++ - 如何在 QListWidget 中为 QStringList 的每个项目显示一个 QLabel 和另一个 QString?

c++ - Linux 上 C/C++ 中的简单原始套接字服务器

java - 更新客户端 GUI

java - 如何将 ObjectGraphMeasurer.measure(object) 的结果转换为字节?