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这个启动函数会导致内存泄漏吗?或者“可能丢失”这个词意味着它实际上可以吗?
我还没有看到'' - > start()''这个错误,但是它看起来像你的子类QThread。在大多数情况下,它并不是最好的选择。最终你的子类必须对第二条消息做些什么。实际上,它看起来像valgrind将整个线程子类减少到''thread-> start()''。 “可能会丢失”的意思是,你最终得到了泄漏。第一条消息只是告诉你你的应用程序尝试从无效内存地址读取数据。当waitforDisconnected()检查连接是否仍然有效,但连接内存已经释放时,最终会发生这种情况。 –
要修复第一条消息,我应该首先检查套接字上的isOpen,并且只有在真正调用waitforDisconnected的情况下才会这样做: (或者是否有'正确'等待避免这种情况)。我不清楚你的意思是“对第二条信息做些什么”......我该如何解决这个问题? – TSG
只能通过一个线性长运行指令块(例如图像处理)完成子类化QThread。只要您需要事件/信号/插槽,条件等待,互斥锁,循环等,您就被迫创建一个对象并将其移至非sublclassed QThread(使用信号/插槽连接)或使用QtConcurrent。但这可能无法解决你的(可能的)泄漏,它只是使用线程的良好实践方式。并不是说必须有泄漏,只是valgrind无法找到有关失踪街区的信息。 –