我正在使用线程telnet服务器(每个连接一个线程),并且无法弄清楚如何摆脱valgrind错误.我把问题缩小到了删除tcpsocket的地方.
我在QThread的run()方法中创建了QTcpSocket:
void TelnetConnection::run()
{
tcpSocketPtr = new QTcpSocket();
if (!tcpSocketPtr->setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocketPtr->error());
return;
}
....
}
Run Code Online (Sandbox Code Playgroud)
当我的应用想断开客户端时,我打电话:
void TelnetConnection::disconnectClient()
{
tcpSocketPtr->disconnectFromHost();
}
Run Code Online (Sandbox Code Playgroud)
并且在socket断开连接时调用的插槽是:void TelnetConnection :: clientDisconnected()
{
tcpSocketPtr->deleteLater();
TelnetConnection::s_clientCount--;
QThread::quit(); // Exit ths event loop for this thread
}
Run Code Online (Sandbox Code Playgroud)
所以,我试过1.删除clientDisconnected插槽中的QTcpSocket,但这会导致读/写不稳定.(偶然崩溃)2.在clientDisconnected插槽中删除,但导致内存读/写错误3.在线程的exec循环后删除但仍然导致内存读/写错误4.在线程的exec循环后删除 - 并且全部错误消失了.
从我读到的内容,如果在exec循环终止后调用deletelater,则会在删除线程时运行.因此,虽然这有效,但我认为这不是正确的方法.
我尝试使用"this"作为父级创建QTcpSocket,但由于父级vs这种不匹配错误,我的信号连接失败.(这将允许在线程销毁时删除QTcpSocket).
解决这个问题的正确方法是什么?