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块后面留下所有通用的位,这可能会更好吗?对不起,如果需要一段时间,我和家人出去做了大约一个小时的事情。