Löschen von TObject
-
Hallo,
*
ich kann mir vorstellen das es so eine Frage schon mal gab, aber leider habe ich über die Momentanen Suchmöglichkeiten nichts gefunden.
*
Aber kommen wir mal zum eigentlichen Problem:Ich fülle eine ComboBox mit Strings aus einer Datenbank. Für die weitere Verarbeitung brauche ich den zum String gehörenden ID Wert des Datensatzes.
Das schaut das jetzt aus:while (!Form1->Query1->Eof) { myComboBox->Items->AddObject( Form1->Query1->FieldByName("NAME")->AsString + ", " + Form1->Query1->FieldByName("NAME2")->AsString, (TObject *)Form1->Query1->FieldByName("ID")->AsInteger); Form1->Query1->Next(); }Nun muß ich diese TObjects ja auch wieder löschen. So habe ich es unter anderem versucht:
for (int i=0;i<myComboBox->Items->Count;i++) delete myComboBox->Items->Objects[i];Das Ergebnis: Zugriffsverletzungen. Ich habe auch mit free() nichts erreicht und bin so langsam am Verzeifeln.
Ich glaube das ich auf einem grundsätzlichen Holzweg.
Gruß
Daniel
-
Ein paar rhetorische Fragen:
Hast du irgendwo mit new Speicher für die Objekte reserviert?
Was passiert, wenn du versuchst, Speicher freizugeben, den du gar nicht reserviert hattest?
-
Jansen schrieb:
Hast du irgendwo mit new Speicher für die Objekte reserviert?
Nein
Jansen schrieb:
Was passiert, wenn du versuchst, Speicher freizugeben, den du gar nicht reserviert hattest?
Zugriffsverletzungen
Autsch!
Und siehe da, da wo ich mit new AnsiStrings erzeuge und ranhänge klappts auch mit dem delete.Danke für Deine rhetorische Fragen
-
Ich glaube, du hast die falschen Schlüsse gezogen.

Du musst nicht auf new umstellen, sondern einfach auf das delete verzichten.
-
Jansen schrieb:
Ich glaube, du hast die falschen Schlüsse gezogen.

Du musst nicht auf new umstellen, sondern einfach auf das delete verzichten.Nein, nein... Habs schon richtig verstanden. Ich hatte an einer anderen Stelle noch so einen Konstrukt mit new verwedet, bei dem klappt auch das delete.
Den werd ich aber auch demnächst mal umbasteln.
-
Die Objekte gehören Deiner Query1 und die Query1 gehört der Form. die VCL kümmert sich selber darum, Du mußt da nichts azfräumen. Also nochmal allgemein gesprochen, alles was Du auf eine Form oder sonstige Komponente per Maus klick ablegst wird vom Besitzerobjekt aufgeräumt.
Gruß Michel
-
@Michel: Das ist zwar richtig, nur benutzt DMarko hier die Rückgabewerte mehrerer Funktionen.
Form1->Query1->FieldByName("NAME")->AsString + ", " + Form1->Query1->FieldByName("NAME2")->AsStringDieser Teil liefert ein Stack-Objekt, genau so wie dieser Teil:
Form1->Query1->FieldByName("ID")->AsInteger)Die räumen sich selber auf, sobald der Scope verlassen wird. Deshalb auch die AVs. Auch die Tatsache, das sein Programm noch richtig funktionierte war mehr Zufall als sonst was. Wenn er nun aber mittels new AnsiString(...seine Stringerstellung...); ausführt, bekommt er als Resultat ein wunderschönes Heap-Objekt welches genau das macht was er erwartet...
Musste auch 3 mal hinschauen, bis ich sah das Jansen hier wohl falsche Schlüsse gezogen hat (o;
EDIT: Was mir allerdings noch unklar ist: Wieso führst du, Marko einen delete auf die ID aus? Theoretisch könntest du auch einfach die ID wie gehabt verwenden und einfach auf das Delete verzichten?...mir fällt grad auf ich hab da wohl selber auch was falsch interpretiert (o:
-
DMarko schrieb:
(TObject *)Form1->Query1->FieldByName("ID")->AsInteger;Das das funktioniert wundert mich eigentlich viel mehr. Einen int nach TObject***** casten?????
-
Klar geht das.... ein handelsüblicher reinterpret_cast (in C++) oder eben C Cast lässt so zimlich alles zu.
Ein Cast sagt ja nix anderes als "lass ma, lieber Compiler, ich weiss schon was ich tu"...
-junix
-
Öhm,
verstehe ich was nicht oder lauft Ihr alle in die falsche Richtung?
Das spannende an der Sache ist die Zeile
[cpp]
myComboBox->Items->AddObject(Sting s, TObject*);
[/cpp]Das hängt an einen AnsiSting ein TObject* an. Und nun war meine Frage halt nur wie ich diese Objects wieder löschen müß was ich das im Man so gelesen hatte.
Jansen hatte schon recht. Da ich nie Speicher mit new reserviert habe, mußte ich den auch nicht wieder freigeben.
Das ist schon das ganze Geheimis. Das TQuery hat herzlich wenig damit zu tun, es liefert mir ja nur den Sting bzw den int.
Das sich das TQuery von selber aufräumt ist mir schon klar. Sonst hätte ich ca 10.000 Lecks in meinem Proggi
Und der Genosse Codeguard meckert auch nicht...
Gruß und danke
Daniel