Hi,
Zuerst Sorry für das Subjekt aber ich weiß selber nicht genau was das Problem ist. Daher versuche ich es so gut es geht zu beschreiben:
Ich habe ein QWidget in dessen Konstruktor ich einige Labels und Buttons erstelle. Dazu erstelle ich noch eine ganze Menge QPixmaps, die ich den Buttons zuordne. Dieses QWidget wird nun bei jedem Druck auf einen Knopf neu geladen. Dazu rufe ich "delete Widget" auf. Die Buttons und Label haben als Parent jeweils das QWidget, die sollten also automatisch gelöscht werden. Die QPixmap nicht, daher habe ich im Dekonstruktor des QWidget jedes QPixmap mit delete entfernt.
Jetzt das Problem:
Wenn ich das Programm in VS (mit QT 3.2 aus dem Buch von damals) per Debug laufen laße läuft alles wie ich es will, nur am Ende, wenn ich es über das Kreuz oben rechts abbreche, kommt eine Fehlermeldung und ein Verweis auf "FreeHeap".
Wenn ich das Programm aber über die exe-Datei (die im Debug-Modus erstellt wurde) aufrufe, dann bricht es nach einigen wiederholten klicks auf den Button ab. Hier bekomme ich keine Fehlermeldung.
Ich weiß nicht mehr weiter, hatte vielleicht jemand schonmal solche Probleme?
Vielen Dank ...
palli
Speicherprobleme (zumindest denke ich das)
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Am laufenden Band. Schreibe mal deinen Quellcode hier rein, dann kann man sich das vielleicht besser vorstellen, um was es genau geht.
Du bekommst über die exe keinen Fehler, weil du keinen direkten Output hast. Hast du eine Möglichkeit das Programm mal unter Linux zu bauen? Dort kannst du dir ziemlich sicher sein, das du über die Shell immer eine Ausgabe erhält. Ich löse z.B. Probleme unter Linux schneller als unter Windows.
Du bekommst über die exe keinen Fehler, weil du keinen direkten Output hast. Hast du eine Möglichkeit das Programm mal unter Linux zu bauen? Dort kannst du dir ziemlich sicher sein, das du über die Shell immer eine Ausgabe erhält. Ich löse z.B. Probleme unter Linux schneller als unter Windows.
-
ArneStocker
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
Code: Alles auswählen
Die QPixmap nicht, daher habe ich im Dekonstruktor des QWidget jedes QPixmap mit delete entfernt.
Das lohnt doch allenfalls bei grossen Pixmaps.
Beim Zuweisen eines Pixmaps an einen Button (oder ein Label) wird m.E. das Objekt kopiert (wie QT dabei den Speicher intern optiemiert geht uns dabei nichts an). Da braucht dann nichts mehr freigegeben werden. Und die lokale Kopie auf dem Stack ist solange gültig, wie Du in Deinem Bezugsrahmen bist (oder wenn Du das QPixmap als Member des Widget haben sollstest, solange wie das Objekt gültig ist):
Gruss Arne
Das kopieren geschieht eigentlich in der setPixmap Methode und nicht beim zuweisen, da ja ne const Referenz uebergeben wird.ArneStocker hat geschrieben: Beim Zuweisen eines Pixmaps an einen Button (oder ein Label) wird m.E. das Objekt kopiert (wie QT dabei den Speicher intern optiemiert geht uns dabei nichts an).
Hmm....wieso geht uns das nichts an, was Qt intern anstellt?
Das schoene daran ist, dass man sich nicht mehr um das Pixmap, welches man reingegeben hat, kuemmerm muss. Intern erstellt QT anhand der Referenz dann ne Kopie vom Pixmap im Heap und verwaltet die.ArneStocker hat geschrieben: Da braucht dann nichts mehr freigegeben werden. Und die lokale Kopie auf dem Stack ist solange gültig, wie Du in Deinem Bezugsrahmen bist (oder wenn Du das QPixmap als Member des Widget haben sollstest, solange wie das Objekt gültig ist):
Goos
-
ArneStocker
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
Code: Alles auswählen
dass man sich nicht mehr um das Pixmap, welches man reingegeben hat, kuemmerm muss
.. mich interessiert jetzt allerdings, was hat palli denn eigentlich mit delete freigegeben ?
Gruss Arne