delete QObject oder QObject->deleteLater()

Alles rund um die Programmierung mit Qt
Antworten
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

delete QObject oder QObject->deleteLater()

Beitrag von mikro »

Servus,
ich versuche die Objekte in meinem Layout zu löschen. Wenn ich jedes einzelne mit delete lösche oder auf die QMap in der sich die befinden qDeleteAll anwende bekomme ich jedesmal einen Absturz.
Wenn ich stattdessen für alle Objekte in dem Map jeweils deleteLater() aufrufe klappts. Kann mir jemand erklären woran das liegen könnte?
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

debugge das ganze und schaue bei den einzelne delete ob auch die qmap kleiner wird ...

Das selbe problem hatte ich auch die aussere elemente zu deleten .. bringt nichts wenn qmap removeAt(int xx ); nicht vor delete aufgerufen wird ....
mache ein emit vor dem delete um auch aus der qmap zu entfernen...

Sonst wenn qmap immer die selbe groesse hat und du 2 elementen deletet hast .. wenn das nachste mal qmap aufgerufen ist dann sturzt er ab....
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

ok, wenn ich die ziele der pointer in dem qmap delete und danach wieder darauf zugreife muss das programm abstürzen, sehe ich ein. Aber beim ersten Aufruf von qDeleteAll auf das QMap? Ausserdem sollte es doch eigentlich reichen, wenn ich

Code: Alles auswählen

qDeleteAll(QMap);
QMap.clear()
mache, anstatt jedes einzeln zu löschen, oder?
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

mikro hat geschrieben:ok, w

Code: Alles auswählen

qDeleteAll(QMap);
QMap.clear()
mache, anstatt jedes einzeln zu löschen, oder?

wen qmap.size() null raus kommt den reicht es... es gibt keine arbeit ein
qDebug() << "### qmap.size() " << qmap.size();
hineinzu tun um die groesse zu sehen und wenn ich ein delete mache mache ich auch ein delete aus qmap und nicht alle...
mikro
Beiträge: 60
Registriert: 19. April 2006 09:23
Wohnort: Erlangen
Kontaktdaten:

Beitrag von mikro »

ok, habe zwischenzeitlich festgestellt, dass mein Problem eigentlich noch woanders liegt: ich hatte die Objekte im layout mit findchildren versucht und da drauf delete bzw. deleteLater aufgerufen.
1) QObject::FindChildren arbeitet rekursiv, wenn man das verwendet und delete bei allem probiert was man findet, dann kann das zu Problemen führen, wenn man layouts mit kindern dabei hat - die wurden dann nämlich schon u.U. schon von ihrem parent dem layout gekillt
2) deleteLater() ist schlau genug nix zu löschen, was nicht mehr existiert, damit crasht die Applikation wenigstens nicht mehr. Allerdings kann das ein bischen dauern - dadurch passiert es anscheinend gelegentlich, dass mein Programm schon im Glauben das Objekt wäre gelöscht weiterläuft während das Objekt noch auf einen guten Zeitpunkt wartet.
Antworten