[gelöst]Pointer freigeben

Alles rund um die Programmierung mit Qt
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

[gelöst]Pointer freigeben

Beitrag von AuE »

Moinsen!

Was mich schon lang interessiert... wie schauts eig mit den ganzen Pointern aus die man so anlegt- muss man die selbst wieder freigeben oder macht das Qt automatisch? Ich meine jetzt die im Funktionsscope.

Denn wenn ich mir z.B. nen Validator für nen QLineEdit mache a la

Code: Alles auswählen

QRegExp rxNR("[1-9]\\d{0,2}"); // min 1 Zahl.... max noch 2 Zahlen (insges 3 Zahlen)
	[b]QValidator *validator = new QRegExpValidator(rxNR, this);[/b]
	// the edit lineedit will only accept integers between 1 and 999
	ui.leKennnr->setValidator(validator);	
müsste ich doch eig dann am Ende der Funktion ein delete(validator) machen um den speicher wieder freizugeben.

Allerdings wenn ich das mache kommt es zu Problemen-das Edit hat dann keinen Validator mehr.


Also muss ich darauf hoffen das Qt den Speicher aufräumt(hoffentlich besser als der Garbage Collector) oder wie gebe ich den Speicher ordentlich wieder frei?

Mi ist schon aufgefallen das Qt Programme über die Zeit gesehen vom Speicher her wieder nachlassen(was wenn man aus .NET kommt sehr verwundert ;-) )
Von daher bin ich bisher davon ausgegangen das Qt das für mich macht... aber irgendwie packt mich doch jetz so ne leichte Paranoia!
Zuletzt geändert von AuE am 18. Dezember 2008 16:29, insgesamt 1-mal geändert.
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag von The User »

Also werden im Destruktor wirklich alle Zeiger, die automoc entdeckt gelöscht?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wer ist automoc?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Kurz zusammengefasst:

Ich muss mich nicht ums aufräumen kümmern. Wenn ich Funktionslokal nen pointer mittels new erstelle brauche ich den nicht wieder freizugeben ( was ja dazu führt das die gewünschte Funktionalität nicht mehr da ist)
Wenn das Object "zerstört" wird kümmert sich Qt (also bei d´tor des QObjects darum das alle Pointer sauber wieder frei gegeben werden?!

Frage ist nur deshalb gestellt da ich eine Maske habe zur Eingabe. Diese hat mehrere Validatoren für die einzelnen LineEdits. Und nun möchte ich nur sicher gehen das diese Ptr nach jedem zerstören beseitigt werden und der Speicher wieder freigegeben wird. Wenn die ptr´s danach irgendwo in Wald zeigen würden so hätte ich ja irgendwann das Problem wie bei jedem MS Programm... Das Programm wächst und wächst....(also sein Speicher) :-D
Das kann ich aber 100%ig ausschließen? Ihr habt da sicher schon mehr Erfahrung als ich
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Nein, wir können das nicht 100% ausschliesen, da wir ja nicht die Qt-Bibliothek geschrieben haben...

Aber wir verlassen uns genauso darauf, daß alle Klassen, die von QObject abgeleitet sind und denen ein parent mitgeteilt wurde, auch gelöscht werden, wenn der parent gelöscht wird.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Ok.... eine Detailiertere AW hab ich auch nicht erwartet ;-)

Das lässt folgendes Schlussfolgern: Die new Operationen wenn möglich nur im c´tor machen somit kann auch kein Müll passieren!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das hat auch nichts mit dem Konstrutkor zu tun. Du kannst überall ein new aufrufen und das aktuelle Objekt als parent zuweisen.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Jau..... aber nehmen wir mal an ich würde das im PaintEvent(überschrieben) machen... wäre das dann nicht gefährlich? Ich meine mal angenommen ich ziehe das Window dann über den Screen bekomme ein haufen new ptr´s die ich dann erstmal net mehr deleten kann. und diese werden erst zerstört wenn der parent zerstört wird. handelt es sich jetzt um eine anwendung die tage/wochenlang laufen soll so wäre das doch gefährlich oder?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wieso machst du es dann mit new, wenn du so Angst hast, dass das Objekt noachher nocht exisitert?

Code: Alles auswählen

QRegExp rxNR("[1-9]\\d{0,2}"); // min 1 Zahl.... max noch 2 Zahlen (insges 3 Zahlen)
   QRegExpValidator validator(rxNR, this);
   // the edit lineedit will only accept integers between 1 and 999
   ui.leKennnr->setValidator(&validator);
Nur kannst du dann Angst haben, dass die Ui nach Verlassen dieser Methode noch weiter existiert, aber die Referenz auf den Validator auf nix mehr zeigt.

Genau so kannst du im übrigen einen "QPainter p;" im painEvent anlegen, muss doch wirklich nicht mit new sein.
Dann sollte das Objekt auch automatisch futsch gehen, wenn der Scope verlassen wird.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

hast du keine angst wenn mit new arbeitest aber kein delete machst? ich frage mich halt nur weil in jedem Troll Bsp. immer mit "new" arbeiten aber nie wieder freigeben
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Jetzt auf dein Validator-Beispiel bezogen:
Schau mal nach [qt4-srcdir]/examples/widgets/validators in die main.cpp.
Da gibts die Klasse ValidatorWidget.

Code: Alles auswählen

void ValidatorWidget::updateValidator()
{
    QIntValidator *v = new QIntValidator(minVal->value(), maxVal->value(), this);
    v->setLocale(locale());
    editor->setValidator(v);
    delete validator;
    validator = v;

    QString s = editor->text();
    int i = 0;
    if (validator->validate(s, i) == QValidator::Invalid) {
        editor->clear();
    } else {
        editor->setText(s);
    }
}
Also, validatorpointer merken, bei einem update delete + neu zuweisen.
Nur weil du das mit den "ganzen new" gebracht hast.

Und Painter werden in keinem Beispiel und auch im qt-sourcecode selber nie (!) mit new angelegt. Also gibts auch kein Speicherleck beim Fensterverändern.

Grüße
Franz

// edit:
hab da leider keinen Beleg für, hab aber gelesen, dass der Linux-Kernel beim Programm beenden mittlerweile selbständig den Speicher wieder aufräumt. Also wenn du ein Leck haben solltest, bleibt der Speicher nicht dicht, wenn du das Programm schließt.
Zuletzt geändert von franzf am 18. Dezember 2008 16:18, insgesamt 1-mal geändert.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

AuE hat geschrieben:hast du keine angst wenn mit new arbeitest aber kein delete machst? ich frage mich halt nur weil in jedem Troll Bsp. immer mit "new" arbeiten aber nie wieder freigeben
Kommt doch auf die Situation an. Sicher ist es doof, bei jedem Zeichnen-Event mit new Speicher zu holen, der erst am Programmende wieder freigegeben wird.

In der Trolltech Beispielen ist das aber meist, wenn das Layout der Anwendung erzeugt wird. Wenn du dein QMainWindow hast, und irgendwo im Konstruktor oder einer Init-Methode deine Widgets 100x mit new hinzufügst, ist das vollkommen unerheblich, weils eben nur einmal passiert. (welche Widgets warum dann nicht gelöscht werden müssen, steht in der Doku).
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

ok ist verständlich... glaub wir haben das thema genug erörtert und ich hab ja die aw´s ;-) setze dann das thema mal auf solved
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

@franzf: Alle mir bekannten Betriebssysteme geben den Programmspeicher beim beenden wieder frei.
Antworten