Mit delete socket und socket = 0 scheint das ja nicht zu gehen.
QTcpSocket korrekt löschen
QTcpSocket korrekt löschen
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.
Mit delete socket und socket = 0 scheint das ja nicht zu gehen.
Re: QTcpSocket korrekt löschen
Wie hast du das Objekt angelegt, und warum scheint das ja nicht zu gehen?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.
Schau mal im Assistant unter und . Vielleicht hilft dir das weiter.
Code: Alles auswählen
QAbstractSocket::disconnectFromHost()Code: Alles auswählen
QAbstractSocket::close()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:
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));
}Du meinst das sock->close()? Hab das nur zum testen mal dazugeschrieben, scheint ja nix zu ändern...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...
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.
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) 160-mal heruntergeladen
erstens fehlt da eindeutig ein
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?
hth..
Code: Alles auswählen
#if QT_VERSION < 0x040500
// scher dich zum t....
#endif
drittens... wo löschst du diesen QTimer wieder?
Code: Alles auswählen
void QNetFind::createSearchThreads()
{
...
QTimer *closeTimer = new QTimer();
1. Was genau bewirkt das? Hab das Projekt mit Qt Creator erstellt und nur meinen Code dazugeschrieben.solarix hat geschrieben:erstens fehlt da eindeutig einzweitens ist der code nicht besonders gut zu lesen, weil du GUI und Logik in einer Klasse hast..Code: Alles auswählen
#if QT_VERSION < 0x040500 // scher dich zum t.... #endif
drittens... wo löschst du diesen QTimer wieder?hth..Code: Alles auswählen
void QNetFind::createSearchThreads() { ... QTimer *closeTimer = new QTimer();
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?
<klugscheissmode>
</klugscheissmode>
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")Was genau bewirkt das?
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...nur mal so "hingefetzt"
</klugscheissmode>
Hmmm gar nicht, sollten die sich nicht eh selbst löschen mit singleShot?
Wo genau steht da, dass die Instanz hinterher gelöscht wird?A single-shot timer fires only once, non-single-shot timers fire every interval milliseconds.