[gelöst] freigeben dynamisch angelegter QTcpSockets
Verfasst: 7. April 2011 12:48
Hallo,
ich habe eine kleines Client/Server-Anwendung. Der Server ist auch soweit problemlos. Aber der Client baut Speicher auf. Es ist alles noch im Anfangsstadium des Projektes und die Kommunikation läuft immer gleich ab. Zu Testzwecken mit qDebug() habe ich eine kleine Testklasse angelegt:
TcpSocket.h
TcpSocket.cpp
Also wirklich nur eine Kleinigkeit um im Destruktor eine Ausgabe machen zu können.
Nun habe ich eine Klasse die per moveToThread() einen eigenen Thread bekommt und die einen Slot hat der per Connect an das started()-Signal eines eigenen QThreads gekoppelt wird. Dort wird TcpSocket folgendermassen angelegt:
"name" wird dem Konstruktor übergeben und ist einfach nur der String "TEST" mit angehängter Nummerierung zum Erkennen. Dann werden ein paar Daten hin und her geschickt. Der Client liest als letztes in folgendem Slot der an readyRead() connected ist:
Hier wird also der Socket disconnected(). Der Slot sieht dann so aus:
Das ended()-Signal teilt dann der Verwaltung mit das dieser Thread beendet ist und der dazugehörige QThread beendet werden kann. Das funktioniert auch alels. Aber das
funktioniert nicht immer. Es erscheint folgende Ausgabe in der Console:
Vielen Dank und Grüße,
Willi
ich habe eine kleines Client/Server-Anwendung. Der Server ist auch soweit problemlos. Aber der Client baut Speicher auf. Es ist alles noch im Anfangsstadium des Projektes und die Kommunikation läuft immer gleich ab. Zu Testzwecken mit qDebug() habe ich eine kleine Testklasse angelegt:
TcpSocket.h
Code: Alles auswählen
#ifndef TCPSOCKET_H
#define TCPSOCKET_H
#include <QTcpSocket>
class TcpSocket : public QTcpSocket
{
Q_OBJECT
public:
explicit TcpSocket(const QString& n, QObject *parent = 0);
virtual ~TcpSocket();
private:
QString name;
};
#endif // TCPSOCKET_HCode: Alles auswählen
#include <QDebug>
#include "tcpsocket.h"
TcpSocket::TcpSocket(const QString& n, QObject *parent) :
QTcpSocket(parent),
name(n) {
}
TcpSocket::~TcpSocket() {
qDebug() << "Destructor: " << name;
}Nun habe ich eine Klasse die per moveToThread() einen eigenen Thread bekommt und die einen Slot hat der per Connect an das started()-Signal eines eigenen QThreads gekoppelt wird. Dort wird TcpSocket folgendermassen angelegt:
Code: Alles auswählen
void ConnectionTest::startWork() {
socket = new TcpSocket(name,this);
connect(socket, SIGNAL(connected()), this, SLOT(connected()));
socket->connectToHost("localhost",36001,QIODevice::ReadWrite);
}Code: Alles auswählen
void ConnectionTest::readSocket1009() {
disconnect(socket, SIGNAL(readyRead()), this, SLOT(readSocket1009()));
QByteArray txt(socket->readAll());
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
socket->disconnectFromHost();
}Code: Alles auswählen
void ConnectionTest::disconnected() {
qDebug() << "Es soll gelöscht werden: " << name;
socket->deleteLater();
socket = NULL;
emit ended();
}Code: Alles auswählen
socket->deleteLater();Woran kann das liegen?Es soll gelöscht werden: "Test00000000001"
Es soll gelöscht werden: "Test00000000002"
Es soll gelöscht werden: "Test00000000003"
Destructor: "Test00000000003"
Es soll gelöscht werden: "Test00000000004"
Destructor: "Test00000000004"
Es soll gelöscht werden: "Test00000000005"
Destructor: "Test00000000005"
Es soll gelöscht werden: "Test00000000006"
Destructor: "Test00000000006"
Es soll gelöscht werden: "Test00000000007"
Destructor: "Test00000000007"
Es soll gelöscht werden: "Test00000000008"
Destructor: "Test00000000008"
Es soll gelöscht werden: "Test00000000009"
Destructor: "Test00000000009"
Es soll gelöscht werden: "Test00000000010"
Destructor: "Test00000000010"
Es soll gelöscht werden: "Test00000000011"
Destructor: "Test00000000011"
Es soll gelöscht werden: "Test00000000012"
Destructor: "Test00000000012"
Es soll gelöscht werden: "Test00000000013"
Destructor: "Test00000000013"
Es soll gelöscht werden: "Test00000000014"
Destructor: "Test00000000014"
Es soll gelöscht werden: "Test00000000015"
Es soll gelöscht werden: "Test00000000016"
Destructor: "Test00000000016"
Vielen Dank und Grüße,
Willi