Seite 1 von 1
QTcpSocket korrekt löschen
Verfasst: 19. Februar 2009 16:25
von Strahlex
Wie kann ich einen QTcpSocket korrekt löschen, so das der ganze Speicher wieder freigegeben wird?
Mit delete socket und socket = 0 scheint das ja nicht zu gehen.
Re: QTcpSocket korrekt löschen
Verfasst: 19. Februar 2009 16:46
von pfid
Strahlex hat geschrieben:Wie kann ich einen QTcpSocket korrekt löschen, so das der ganze Speicher wieder freigegeben wird?
Mit delete socket und socket = 0 scheint das ja nicht zu gehen.
Wie hast du das Objekt angelegt, und warum scheint das ja nicht zu gehen?
Verfasst: 19. Februar 2009 17:18
von solni
Schau mal im Assistant unter
und
. Vielleicht hilft dir das weiter.
Verfasst: 19. Februar 2009 19:17
von Strahlex
Also mein Problem ist das der verbrauchte Speicher nicht mehr freigegeben zu werden scheint. Ich bin nämlich gerade beim bauen eines Programms das das Netzwerk nach anderen Rechner mit dem selben Programm durchsucht (also versucht sich zu der IP zu verbinden), dabei werden die Sockets dynamisch als Pointer erstellt.
Löschen versuche ich sie mit dieser Funktion:
Code: Alles auswählen
void QNetFind::deleteSearchSocket(QTcpSocket *sock)
{
sock->close();
delete sock;
sock = 0;
openSockets--;
ui->lblOpenSockets->setText(tr("Offene Verbindungen: %1").arg(openSockets));
}
Verfasst: 19. Februar 2009 19:20
von upsala
Das macht nur keinen Sinn, da der Destruktor von QAbstractSocket, der nach dem Destruktor von QTcpSocket aufgerufen wird, ein disconnectFromHost() und dann ein close() ausführt...
Verfasst: 19. Februar 2009 19:36
von Strahlex
upsala hat geschrieben:Das macht nur keinen Sinn, da der Destruktor von QAbstractSocket, der nach dem Destruktor von QTcpSocket aufgerufen wird, ein disconnectFromHost() und dann ein close() ausführt...
Du meinst das sock->close()? Hab das nur zum testen mal dazugeschrieben, scheint ja nix zu ändern...
Verfasst: 19. Februar 2009 19:42
von upsala
Mein Antwort war auf den Beitrag von solni bezogen. Woraus schließt du das der Speicher vom QTcpSocket nicht freigegeben wird?
Verfasst: 19. Februar 2009 19:44
von Strahlex
upsala hat geschrieben:Mein Antwort war auf den Beitrag von solni bezogen. Woraus schließt du das der Speicher vom QTcpSocket nicht freigegeben wird?
Die Systemüberwachung (Ja so heißt der Task-Manager in KDE4) zeigt mir pro Suchvorgang (200 Sockets werden geöffnet) ca 3Mb mehr Speicherbrauch an.
Verfasst: 19. Februar 2009 19:59
von upsala
Arbeite dich mal in valgrind ein...
Verfasst: 20. Februar 2009 08:53
von Strahlex
Valgrind hat mir leider nicht viel genützt.
Hab mein Programm in einem größeren Netzwerk getestet und da stürtzt es leider ab. Der Debbuger Output ist leider nicht sehr aussagekräftig, aber ich denke das ich die TcpSockets falsch lösche.
Ich hänge mal das komplette Programm an.
Verfasst: 20. Februar 2009 09:59
von solarix
erstens fehlt da eindeutig ein
Code: Alles auswählen
#if QT_VERSION < 0x040500
// scher dich zum t....
#endif
zweitens ist der code nicht besonders gut zu lesen, weil du GUI und Logik in einer Klasse hast..
drittens... wo löschst du diesen QTimer wieder?
Code: Alles auswählen
void QNetFind::createSearchThreads()
{
...
QTimer *closeTimer = new QTimer();
hth..
Verfasst: 20. Februar 2009 19:24
von Strahlex
solarix hat geschrieben:erstens fehlt da eindeutig ein
Code: Alles auswählen
#if QT_VERSION < 0x040500
// scher dich zum t....
#endif
zweitens ist der code nicht besonders gut zu lesen, weil du GUI und Logik in einer Klasse hast..
drittens... wo löschst du diesen QTimer wieder?
Code: Alles auswählen
void QNetFind::createSearchThreads()
{
...
QTimer *closeTimer = new QTimer();
hth..
1. Was genau bewirkt das? Hab das Projekt mit Qt Creator erstellt und nur meinen Code dazugeschrieben.
2. Ja ist klar, hab das ganze nur mal so "hingefetzt" zum testen...
3.Hmmm gar nicht, sollten die sich nicht eh selbst löschen mit singleShot?
Verfasst: 21. Februar 2009 10:50
von solarix
<klugscheissmode>
Was genau bewirkt das?
Ich wollte damit nur andeuten, dass sich dein Code mit dem aktuellen Release (4.4) nicht übersetzen lässt.... wenn man schon mit einer Beta-Version arbeitet, sollte man das a) auch im Forum erwähnen (weil der Fehler ja darin sein könnte) und b) der Code mit einer vernünftigen Fehlermeldung absichern (siehe "Q_VERSION")
nur mal so "hingefetzt"
das führt erfahrungsgemäss genau zu Fehlern, welche zum Beheben viel mehr Zeit kosten als wenn man von Anfang an wenigstens minimal abstrahiert hätte...
</klugscheissmode>
Hmmm gar nicht, sollten die sich nicht eh selbst löschen mit singleShot?
A single-shot timer fires only once, non-single-shot timers fire every interval milliseconds.
Wo genau steht da, dass die Instanz hinterher gelöscht wird?