gpt4 book ai didi

c++ - QTcpServer 中的内存泄漏参与不同线程中的连接

转载 作者:行者123 更新时间:2023-11-28 07:26:36 26 4
gpt4 key购买 nike

我正在 Windows 7 上的 Qt 4.7 中开发一个 RPC 服务器。为了同时参与多个执行,每个请求都在一个单独的线程中运行(因为函数可能会阻塞)。我继承自 QTcpServer 并重新实现了 incomingConnection 函数,它看起来像这样:

void RpcServer::incomingConnection(int socketDescriptor){
QThread *thread = new QThread();
RpcServerConnection *client = new RpcServerConnection(socketDescriptor);
client->moveToThread(thread);
connect(thread, SIGNAL(started()), client, SLOT(init()));
connect(client, SIGNAL(finish()), thread, SLOT(quit()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}

RpcServerConnection 管理数据交换。初始化方法如下所示:

 void RpcServerConnection::init(){
qDebug() << "ServerSocket(" << QThread::currentThreadId() << "): Init";
clientConnection = new QTcpSocket();
clientConnection->setSocketDescriptor(socketDescriptor);

connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readFromSocket()));
connect(clientConnection, SIGNAL(disconnected()), this, SLOT(deleteLater()));
connect(this, SIGNAL(finish()), this, SLOT(deleteLater()));
}

一旦接收到所有数据并发送响应,就会发出完成信号。调试我可以看到所有线程和套接字都被删除了。但是,进程内存会随着每个新连接而增加,并且在结束时不会被释放...

从 QTcpServer 继承时是否需要释放其他任何东西?

最佳答案

问题可能与竞争/未定义的调用顺序有关。 RpcServerConnection::finish() 连接到它的 deleteLater() 槽和线程的 quit() 槽。如果先进入线程的 quit 槽,线程将立即从事件循环中终止,然后才能对延迟删除进行任何操作。

代替:

connect(client, SIGNAL(finish()), thread, SLOT(quit()));

尝试:

connect(client, SIGNAL(destroyed()), thread, SLOT(quit()));

关于c++ - QTcpServer 中的内存泄漏参与不同线程中的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18661945/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com