2013-10-09 19 views
0

我跑Valgrind的在我的Qt/C++程序,并正在此错误:的Qt/C++/Valgrind的无效的8对与QTcpSocket断开READSIZE

Invalid read of size 8 
    in TelnetConnection::disconnectClient() in telnetserver/telnetconnection.cpp:188 

和线路188低于waitForDisconnected行:

void TelnetConnection::disconnectClient() 
{ 
    tcpSocketPtr->disconnectFromHost(); 
    tcpSocketPtr->waitForDisconnected(); 
} 

我不完全确定这个错误是什么意思,但我该如何解决这个问题?或者这是不受我控制的? (Qt问题)?

我不知道它的相关,但我得到的唯一其他错误是:

384 bytes in 1 blocks are possibly lost in loss record 5,342 of 5,972 
    in TelnetServer::incomingConnection(long long) in telnetserver/telnetserver.cpp:22 

和错误行是开始()如下:

void TelnetServer::incomingConnection(qintptr socketDescriptor) 
{ 
    TelnetConnection *thread = new TelnetConnection(socketDescriptor, this); 
    connect(thread, SIGNAL(shutdownRequested()), m_controller, SLOT(shutdownCommandIssued())); 
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
    connect(m_controller, SIGNAL(shutingdown()), thread, SLOT(shutdownConnection())); 
    thread->start(); 
} 

再次.. .how这个启动函数会导致内存泄漏吗?或者“可能丢失”这个词意味着它实际上可以吗?

+0

我还没有看到'' - > start()''这个错误,但是它看起来像你的子类QThread。在大多数情况下,它并不是最好的选择。最终你的子类必须对第二条消息做些什么。实际上,它看起来像valgrind将整个线程子类减少到''thread-> start()''。 “可能会丢失”的意思是,你最终得到了泄漏。第一条消息只是告诉你你的应用程序尝试从无效内存地址读取数据。当waitforDisconnected()检查连接是否仍然有效,但连接内存已经释放时,最终会发生这种情况。 –

+0

要修复第一条消息,我应该首先检查套接字上的isOpen,并且只有在真正调用waitforDisconnected的情况下才会这样做: (或者是否有'正确'等待避免这种情况)。我不清楚你的意思是“对第二条信息做些什么”......我该如何解决这个问题? – TSG

+3

只能通过一个线性长运行指令块(例如图像处理)完成子类化QThread。只要您需要事件/信号/插槽,条件等待,互斥锁,循环等,您就被迫创建一个对象并将其移至非sublclassed QThread(使用信号/插槽连接)或使用QtConcurrent。但这可能无法解决你的(可能的)泄漏,它只是使用线程的良好实践方式。并不是说必须有泄漏,只是valgrind无法找到有关失踪街区的信息。 –

回答

0

有关最佳答案,请参阅上面的sebastian评论。基本上,读/写错误是由于即使在关闭套接字后关闭了套接字(关闭不会停止所有通信),也会继续传输到套接字。解决方法是在删除线程时删除套接字。