Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 队列内存泄漏_C++_Multithreading_Memory Leaks_Thread Safety_Queue - Fatal编程技术网

C++ 队列内存泄漏

C++ 队列内存泄漏,c++,multithreading,memory-leaks,thread-safety,queue,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(TRU

我需要一些帮助来解决我遇到的一些问题。 首先,我的节目

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

大概是这样的:

这将是一个线程:

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函数不会破坏对象一样。它和线程有什么关系吗?
还有什么我做错了吗?

我觉得你的代码一般都没问题。当你说queue::push_back时,你的意思是push,对吗?因为您在代码中正确地使用了push。希望你们并没有在事故中使用push_back,因为那个将是deque::push_back,而不是queue

关于2个小问题

第一点是关于

if (!((ClientInterpreter*)client)->receive(buffer,sizeof(buffer)))
        return -1;
在这里,如果!触摸ClientInterpreter*client->receivebuffer,sizeofbuffer而不是ClientInterpreter*client->receivebuffer,sizeofbuffer?我这样问是因为你可能比我更清楚。我通常很不愿意格外小心,并用额外的括号覆盖我的基础,所以我不能完全确定对语法的影响

第二点,我知道这很挑剔,但可能receiveMessageVoid*客户端拼写错误,receive拼写正确,可能是在其他我们看不到的地方做了一些事情


如果这没有帮助,请给我们更多关于您的测试及其结果的信息。你是否有明显的seg故障?还是你只是注意到了某些漏洞?你试过gdb吗?等等。

输出输入队列的大小,您插入字符串的频率可能比删除字符串的频率高。不要担心拼写错误,我使用的是visual studio,通常它可以帮助您解决这些错误,这可能是因为英语不是我的母语。除此之外,我没有遇到任何问题。只是巨大的内存泄漏。真的很大。这可能是因为我的阅读速度比写作慢得多,但我不确定这一点,因此,在你的whileTRUE循环中,你有继续的权利;把它去掉,然后在剩下的代码中加入一个else,然后在else块后面留下所有通用的位,这可能会更好吗?对不起,如果需要一段时间,我和家人出去做了大约一个小时的事情。