QTcpSocket korrekt löschen

Alles rund um die Programmierung mit Qt
Antworten
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

QTcpSocket korrekt löschen

Beitrag 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.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Re: QTcpSocket korrekt löschen

Beitrag 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?
solni
Beiträge: 6
Registriert: 16. Januar 2009 13:19

Beitrag von solni »

Schau mal im Assistant unter

Code: Alles auswählen

QAbstractSocket::disconnectFromHost()
und

Code: Alles auswählen

QAbstractSocket::close()
. Vielleicht hilft dir das weiter.
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag 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));

}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag 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...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Mein Antwort war auf den Beitrag von solni bezogen. Woraus schließt du das der Speicher vom QTcpSocket nicht freigegeben wird?
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Arbeite dich mal in valgrind ein...
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag 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.
Dateianhänge
qnetfind.tar.gz
(2.73 KiB) 159-mal heruntergeladen
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
Strahlex
Beiträge: 158
Registriert: 23. Dezember 2008 15:49
Wohnort: Österreich

Beitrag 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?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
Antworten