Seite 1 von 1

Programmier-, Qt- oder Xorg-Fehler?

Verfasst: 14. Juli 2008 12:51
von Tilman Räger
Hallo,
Wir haben hier ein kleines Problem, für das wir zwar inzwishcen einen Workaround haben, wo uns aber doch interessiert, wo genau der Fehler liegen könnte:

Eine Anwendung, die nichts anderes macht, als immer wieder neue Widgets auf und wieder abzubauen, führt dazu, daß der Speicherverbrauch der Anwendung und - im gleichen Maß - des Prozesses Xorg (ich nehme mal an, der XServer) kontinuierlich ansteigt, also ein typisches memory leak.
Durch kontinuierlich Reduktion des Codes konnten wir nachweisen, daß das Memory leak nur dann auftritt, wenn in der Routine onPaintEvent() das
lokale QPainter-Objekt via

Code: Alles auswählen

QPainter painter(this);
erzeugt wird, also der in der Dokumentation allgemein vorgeschlagene Weg. Erzeugt man das Objekt mit dem Standard-Konstruktor und verwendet die Funktionen begin() und end(), so tritt kein Memory Leak auf, d.h. Wenn die funktion onPaintEvent wie folgt aufgebaut ist:

Code: Alles auswählen

{
    QPainter painter;

    painter.begin(this);

    // Zeichenfunktionen 

    painter.end();
}
Interessanterweise tritt das Memory-Leak nur auf unserem Zielsystem, einem Display mit einem abgespeckten GNU Linux, auf dem PC (Kubuntu 6.06) tritt das Problem nicht auf. Qt-Version ist Qt 4.1.4.

Kennt jemand das Problem oder kann mir einen Tip geben, wo das Problem liegen könnte?

Gruß
Tilman Räger[/code]

Verfasst: 14. Juli 2008 19:33
von Christian81
Das hört sich recht kommerziell an - schonmal tt-support gefragt. Ggf. auch mal mit neuerer Version ausprobiert? Mir ist sowas nicht bekannt - zumal der dtor auch end() aufruft wie man in den Sourcen sieht.

Verfasst: 16. Juli 2008 14:08
von Tilman Räger
Hallo,

Ja, es ist kommerziell. Anfrage bei Trolltech sollte eigentlich auch laufen. Allerdings habe ich beim Hersteller immer die Befürchtung, daß der Probleme erst einmal als PAL (Problem Anderer Leute) definiert, als erst einmal sagt, es habe nichts mit ihm zu tun. Was ja in diesem Fall auch sein kann.

Sinn meiner Frage hier war eigentlich, ob jemand so ein Verhalten schon einmal gesehen hat und/oder ob jemand mir einen Tip geben könnte, wo der Fehler liegt, wie gesagt - QT, XOrg oder eigener Fehler, ich schließe nichts aus!

Gruß
Tilman (Räger)

Verfasst: 16. Juli 2008 16:31
von Christian81
Wie gesagt - schau Dir die Sourcen von QPainter::~QPainter und QPainter::end() an - der dtor müsste nicht viel weiter machen als end() aufzurufen. Deshalb wundert mich das ein wenig.