【问题标题】:Queue memory leak队列内存泄漏
【发布时间】:2014-05-16 23:59:25
【问题描述】:

我需要一些帮助来解决我遇到的一些问题。 首先是我的程序。

我正在编写一个简单的服务器-客户端程序,其中从服务器发送的消息在一个独立线程中的队列中排队。 然后,有另一个线程读取该队列并执行消息。

类似这样的:

这将是一个线程:

DWORD WINAPI recieveMessage(void* client)
{
    std::string msg;
    char buffer[MAX_SIZE];
    memset(buffer, 0, MAX_SIZE);
    while(TRUE){
        if (!((ClientInterpreter*)client)->receive(buffer,sizeof(buffer)))
            return -1;
        if (sizeof(buffer) == 0){
            memset(buffer, 0, MAX_SIZE);
            continue;
        }
        msg = string(buffer);
        ((ClientInterpreter*)client)->storeMessage(msg);
        memset(buffer, 0, MAX_SIZE);
        msg.clear();
    }   
}

storeMessage 在哪里执行此操作:

void ClientInterpreter::storeMessage(std::string msg)
{
    WaitForSingleObject(INmutex,INFINITE);
    incomingQueue->push(msg);
    ReleaseMutex(INmutex);

}

另一个线程,读取队列的线程在一个while循环中调用这个函数:

std::string ClientInterpreter::getIncomingMessage() {

    std::string retorno;
    WaitForSingleObject(INmutex,INFINITE);  
    if( incomingQueue->empty() ){
        ReleaseMutex(INmutex);
        return "0";
    }   
    retorno = incomingQueue->front();
    incomingQueue->pop();
    ReleaseMutex(INmutex);
    return retorno;

}

首先,我不知道我是否使用了互斥锁,但它可以工作(没有出现并发访问错误),所以我不打扰。

我对此运行了一个分析器,我得到了大量的内存泄漏,所有这些都来自 queue::push_back。 就像 pop 函数不会破坏对象一样。它与线程有什么关系吗? 还有什么我做错了吗?

【问题讨论】:

  • 输出incomingQueue的大小,你插入字符串的频率可能比删除字符串的频率高

标签: c++ multithreading memory-leaks thread-safety queue


【解决方案1】:

您的代码在我看来通常没问题。当您说 queue::push_back() 时,您的意思是 push,对吗?因为您在代码中正确使用了 push()。希望您没有意外使用 push_back(),因为那将是 deque::push_back(),而不是队列。

到 2 个小点。

第一个点是开

if (!((ClientInterpreter*)client)->receive(buffer,sizeof(buffer)))
        return -1;

在这里,如果 !触摸(((ClientInterpreter*)client)->receive(buffer,sizeof(buffer))) 而不是((ClientInterpreter*)client)->receive(buffer,sizeof(buffer))?我问是因为你可能比我更清楚。我通常对特别小心并用额外的括号覆盖我的基础感到很糟糕,所以我不能完全确定对语法的影响。

第二点,我知道这很挑剔,但也许recieveMessage(void* client) 拼写错误和receive 拼写正确可能会在我们看不到的其他地方做一些事情。

如果这没有帮助,请向我们提供有关您的测试及其结果的更多信息。你得到一个明确的段错误吗?还是您只是注意到这里和那里的某些泄漏?你试过gdb吗?等等

【讨论】:

  • 别担心拼写错误,我使用的是 Visual Studio,通常它可以帮助您解决这些错误(可能是因为英语不是我的母语)。除此之外,我没有遇到任何问题。只是巨大的内存泄漏。真的很大。这可能是因为我的阅读速度比写作慢得多,但我不确定
  • 所以,在您的while(TRUE) 循环中,您有continue; else 块后面的位?
  • 抱歉,如果耽搁了一段时间,我和家人出去玩了大约一个小时左右。
猜你喜欢
  • 2021-01-31
  • 2014-05-16
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2013-08-12
  • 2016-11-21
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多