Утечка памяти в QTcpServer при посещении соединений в другом потоке

Я разрабатываю RPC-сервер в Qt 4.7 на Windows 7.
Чтобы одновременно присутствовать на нескольких выполнениях, каждый запрос выполняется в отдельном потоке (поскольку функции могут блокировать). Я унаследовал от QTcpServer и переопределил функциюcomingConnection, это выглядит так:

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 — управляемый обмен данными. Метод init выглядит так:

 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?

0

Решение

Проблема может быть с расой / неопределенным порядком вызова. RpcServerConnection::finish() связано как с его deleteLater() слот и нить quit() слот. Если нить quit слот вводится первым, поток немедленно завершается из цикла обработки событий, прежде чем что-либо делать с отложенным удалением.

Вместо:

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

пытаться:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]