Speicherprobleme (zumindest denke ich das)

Alles rund um die Programmierung mit Qt
Antworten
palli
Beiträge: 10
Registriert: 26. Februar 2005 11:44

Speicherprobleme (zumindest denke ich das)

Beitrag von palli »

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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

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.
palli
Beiträge: 10
Registriert: 26. Februar 2005 11:44

Beitrag von palli »

Mit Linux habe ich leider keine Chance es zu machen.

Aber ich werde heute abend wenn ich wieder zu Hause bin den Code posten.

Danke schonmal ...

palli
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Code: Alles auswählen

Die QPixmap nicht, daher habe ich im Dekonstruktor des QWidget jedes QPixmap mit delete entfernt. 
Erstellst Du etwa Deine QPixmap mit new ?
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
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

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).
Das kopieren geschieht eigentlich in der setPixmap Methode und nicht beim zuweisen, da ja ne const Referenz uebergeben wird.
Hmm....wieso geht uns das nichts an, was Qt intern anstellt? :D
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):
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.

Goos
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Code: Alles auswählen

dass man sich nicht mehr um das Pixmap, welches man reingegeben hat, kuemmerm muss
es ist halt gekappselt, das meinte ich mit, es geht uns nichts an, was ja nicht heisst, dass man sich nicht dafür interessieren darf :-)

.. mich interessiert jetzt allerdings, was hat palli denn eigentlich mit delete freigegeben ?

Gruss Arne
Antworten