Hallo,
ich stehe vor einem Problem, für das ich die beste Lösung suche.
Beim Beenden meines Programms wirft mir die Console den Hinweis aus:
*** glibc detected *** /home/repos/workspace/Application/Application: double free or corruption (!prev): 0x08400098 ***
Ich vermute zumindest wo das Problem liegt. Vielleicht kann mir das hier jemand bestätigen.
Ich arbeite mit einem QTreeWidget. Dort im Konstruktor füge ich viele QTreeWidgetItem ein, z.B. mit:
root = new QTreeWidgetItem(this);
Jedes Item stellt eine logische Verbindung mit einer anderen Struktur dar.
Diese Verknüpfungen werden in einer Map abgebildet. Diese Map wird im QTreeWiget verwaltet und sieht ungefähr so aus:
std::map< QTreeWidgetItem *, StrukturItem * > TreeMap;
beim Beenden des Programms bekomme ich nun den Fehler und ich vermute, dass der Desktruktor des QTreeWidgets, versucht alle QTreeWidgetItems zu löschen. Und bei der Auflösung der Map passiert das gleiche nochmal.
Bin ich da auf dem richtigen Weg? Wenn ja, ist QPointer dann eine mögliche Lösung? Oder spielt da das TreeWidget nicht mit?
Wäre für jeden Tipp dankbar.
Viele Grüße
jerry42
double free or coruption
Von der THeorie bist du auf dem richtigen Weg: Ein Objekt wird 2x zerstört. die Map word es aber nicht sein. Dort liegen nur Pointer, bei deren Zerstörung nicht der Destruktor der Objekte hinter dem Pointer zerstört werden, sondern nur der Zeiger selbst. Daraus kann also dein Problem nicht resultieren.jerry42 hat geschrieben:beim Beenden des Programms bekomme ich nun den Fehler und ich vermute, dass der Desktruktor des QTreeWidgets, versucht alle QTreeWidgetItems zu löschen. Und bei der Auflösung der Map passiert das gleiche nochmal.
wahrscheinlicher ist, dass du irgendwo als Member ein Objekt als Value liegen hast (wird automatisch zerstört), du in einem anderen Objekt aber in einem Zeiger die Adresse dieses Objektes speicherst, und brav bei Nichgebrauch mit delet zerstörst. Geht das erste Objekt über den Jordan, kommt es zu dem "double free".
Oder noch besser (und schwerer zu debuggen): Zeiger auf globale Objekte.
Am besten gehst du mit deinem Debugger drüber und schaust, an welcher Stelle im Code das Problem auftritt, dann hast du einen Anhaltspunkt.