PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Woher kommen meine Speicherlecks?



Boron
12-09-2002, 13:34
In meinem KDevelop-Projekt habe ich ein Speicherleck, das ca. alle 10 Sekunden 4 Byte zusätzlichen Speicher "verschlingt". Das ist zwar wenig, aber inakzeptabel.

Bisher habe versucht alle Stellen wo Qt/KDE-Objekte mit "new" angelegt werden, diese auch wieder mit "free" freizugeben, obwohl Qt und KDE das ja selber machen sollen (habe ich gelesen).

Da ich in meinem Programm mit einem QTimer arbeite, und somit bestimmte Funktionen alle paar Sekunden ausgeführt werden, habe ich auch diese Funktionen noch einmal gewissenhaft durchgearbeitet, aber nichts gefunden, das ein Speicherleck rechtfertigen würde.

Jetzt zur eigentlichen Frage:
Welche Möglichkeiten gibt es noch, dass immer mehr Speicher allokiert wird, und nicht mehr freigegeben wird?
Warum kann ein Programm immer mehr Speicher wollen?

Gruß Boron

peschmae
12-09-2002, 14:14
versuchs mal mit code - auskommentieren...

(zumindest die Timer-Callbacks)

MfG Peschmä

anda_skoa
12-09-2002, 14:15
Wenn du mit new Speicher anlegst, solltest du ihn nicht mit free, sondern mit delete freigeben.

Also falls du wirklich free genommen hast, ersetze es mal durch delete.

Beachte auch, dass du delete[] nehmen mußt, wenn du ein Array angelegt hast.

Bei QWidgets (ich glaube bei QObjects allgemein) brauchst du das nicht zu machen, wenn das Parentwidget ungleich 0 ist, wenn es also ein Parentwidget gibt.

Ciao,
_

peschmae
12-09-2002, 15:55
da merkt man, dass ich kein c++ - Programmierer bin :))

MfG Peschmä

Boron
12-09-2002, 16:06
:confused: Oh Mann, habe ich tatsächlich "free" anstatt "delete" geschrieben? Bin ich besoffen oder was? :confused:
Natürlich meine ich delete, so steht's ja auch in meinen Quelldateien.

Das würde dann bedeuten, dass ich nur das "oberste" Widget mit delete löschen muss, und dass dann alle Child-Widgets automatisch gelöscht werden? Ist das so richtig?

Zurück zum eigentlichen Problem:
Ich habe jetzt mal die connect()-Anweisung, die meinen QTimer mit der Funktion, die immer weider ausgeführt werden soll, auskommentiert.
Und, oh Wunder, der Speicherverbrauch ändert sich auch nach 10 Minuten noch nicht.
Tja, blöd nur, dass ich echt nichts finde, wegen dem Leck.

Gruß Boron

PS: Haha, jetzt habe ich's begriffen: anda_skoa -> underscore. Warum bin ich da nicht früher draufgekommen :D?

Boron
12-09-2002, 16:24
OK, jetzt habe ich es doch gefunden. Ich habe da ein char* label, das von einer Funktion aus der libsensors-Bibliothek (zum Temperaturen und Lüfterdrehzahlen lesen) immer wieder neu allokiert wird (sehr frech :mad: ).

Mit diesem char*-Dingern habe ich immer schon Probleme gehabt (geistig meine ich, ich finde die echt furchtbar).
Kann ich das jetzt mit delete label wieder löschen, oder ist das jetzt falsch?

Gruß Boron

anda_skoa
12-09-2002, 16:46
Original geschrieben von Boron
Das würde dann bedeuten, dass ich nur das "oberste" Widget mit delete löschen muss, und dass dann alle Child-Widgets automatisch gelöscht werden? Ist das so richtig?


Ja, nur wenn dem QWidget Konstructor als Parent 0 übergeben wurde.
Im Normalfall ist das einzige Widget, das so erzeugt wird, das MainWidget.
Das mußt du ansich nicht löschen, weil das die gesamte Laufzeit über gleich bleibt und am Prozessende wird ohnehin der gesamte Speicher freigegeben.



PS: Haha, jetzt habe ich's begriffen: anda_skoa -> underscore. Warum bin ich da nicht früher draufgekommen ?


Hehe, ist auch nicht ganz offensichtlich :D



Mit diesem char*-Dingern habe ich immer schon Probleme gehabt (geistig meine ich, ich finde die echt furchtbar).
Kann ich das jetzt mit delete label wieder löschen, oder ist das jetzt falsch?


ich denke da ist free() besser, das wurde vermutlich sicher mit malloc angelegt.

Ciao,
_

Boron
12-09-2002, 17:10
Das mit free() hat leider nicht funktioniert.

Jetzt mal eine genaue Lagebeschreibung:

Beschreibung aus Header-Datei von libsensors:
/* Look up the label which belongs to this chip. Note that chip should not
contain wildcard values! *result is newly allocated (free it yourself).
This function will return 0 on success, and <0 on failure. This
function takes logical mappings into account. */

extern int sensors_get_label(sensors_chip_name name, int feature, char** result);

Mein Code:
char* label;
int nr1=0, nr2=0;
const sensors_feature_data* sensor_data;
sensors_get_label ( *sensors_chip, sensor_data->number, &label);
free( label);

Wie in der obigen Beschreibung zu lesen ist, wird der dritte Parameter der Funktion sensors_get_label() immer wieder neu allokiert.
Also sollte ich in meiner fünften Zeile das Label wieder löschen, damit kein Speicher verschwendet wird. Aber das free() und delete helfen nicht.
Wie denn jetzt?

Gruß Boron

anda_skoa
12-09-2002, 17:30
Hmm, blöd.

Ansich sollte es mit free gehen.

Probier mal ein delete[] label

Bzw. wenn ich es richtig verstehe, ermittelt das einen Namen.
Der bleibt doch warhscheinlich gleich, oder?

In diesem Fall wäre es vielleicht besser, ihn nur einmal anzufordern.

Ciao,
_