队列内存泄漏

时间:2014-05-16 23:59:26

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

我需要一些帮助,解决我遇到过的一些问题。 最重要的是,我的计划。

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

这样的事情:

这将是一个主题:

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函数不会破坏对象一样。是否必须对线程做任何事情? 还有什么我做错了吗?

1 个答案:

答案 0 :(得分:0)

您的代码通常对我来说似乎没问题。当你说queue :: push_back()时,你的意思是推,对吧?因为您在代码中正确使用了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正确拼写可能会在我们看不见的地方做些什么。

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