Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallo,
ich musste in mein Projekt die Methode AfterConstruction einbauen, denn ich brauche die Möglichkeit, ein Objekt noch während des Konstruktors (bzw. sofort danach) wieder freizugeben. Nun lese ich, dass es diese Methode in Delphi8 nicht mehr gibt: http://www.dsdt.info/insider/sprache/interna/konstruktor.php (ganz unten). Damit geht mir meine Vorwärtskompatibilität verloren.
Hängt das mit NET zusammen? Und wenn ja, wie würde man das Problem in Net lösen?
Danke im Voraus für Eure Antworten
Traude
Bei .Net muss man keine Objekte mehr freigeben. Das geschieht automatisch. Ansonsten ist es auch keine gute Sache im Konstruktor den Speicher selber wieder freizugeben. Man sollte eine Exception auslösen, weil bei einer Exception im Konstruktor sofort der Destruktor aufgerufen wird.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Es ist aber möglich, dass erst anläßlich des Konstruktors klar wird, dass das Objekt, das soeben erzeugt wird, nicht gebraucht wird. Zum Beispiel:
Das Programm fordert eine Textur an mit
Code:
TXYZTexture.Create('Drachenkopf', AOwner);
AOwner(= das Texturen-Verwaltungsobjekt) entdeckt, dass die Textur "Drachenkopf" bereits geladen ist. Ein zweiter solcher wäre bloße Speicherplatzverschwendung, daher duldet AOwner keine Doubletten und verweigert die Registrierung. Das TXYZTexture kann sich selbst fragen, ob es registriert wurde (denn diese Info kriegt es), und wenn nicht, kann es sich selbst freigeben, und zwar im AfterConstruction, schnell und schmerzlos.
Natürlich wäre auch möglich, dass vor dem Erzeugen der Textur angefragt wird, ob es eine solche Textur schon gibt, aber angenommen, das wird einmal vergessen? Dann habe ich ein freischwimmendes nutzloses Objekt, das sowohl Speicherplatz in der CPU als auch in der GPU verbraucht.
Dh. ich müsste für NET auf eine Exception im Konstruktor umsteigen.
Nein, das mit der Exception bezog sich noch auf das normale Delphi. Bei .Net gibt es keinen Destruktor im eigentlichen Sinne. Es gibt einmal die Möglichkeit IDisposable mit der Methode Dispose zu implementieren, falls Ressourcen explizit durch den Programmierer freigegeben werden müssen. Dann muss man Dispose aufrufen, so wie man jetzt Free aufruft. Bei Delphi.Net ruft .Free auch Dispose auf. Die zweite Möglichkeit ist Finalize zu überschreiben. Diese Methode wird vom System ausgeführt, wenn es keine Referenzen mehr auf das Objekt gibt. Kombinationen aus beiden Varianten sind auch möglich.
Wie weit das mit dem Problem zu tun hat, weiß ich nicht. Falls das Objekt sonst keine externen Resourcen belegt, braucht man gar nichts zu tun. Wenn es nicht mehr referenziert wird und das ist der Fall, wenn man es keiner lokalen Variable zuweist, wird es automatisch entfernt. Ansonsten wäre noch zu überlegen, ob das die richtige Strategie ist. Es wäre eventuell leichter, die Texture beim Verwaltungsobjekt anzufordern und gar nicht erst erstellen zu lassen. Wenn sich das Verwaltungsobjekt auch um die Erstellung kümmert, wäre das mit dem Vergessen eigentlich auch kein Problem.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Zitat:
Es wäre eventuell leichter, die Texture beim Verwaltungsobjekt anzufordern und gar nicht erst erstellen zu lassen. Wenn sich das Verwaltungsobjekt auch um die Erstellung kümmert, wäre das mit dem Vergessen eigentlich auch kein Problem.
Naja, manchmal hab ich software-technisch bestimmte Vorgaben zu beachten und habe daher nicht immer die freie Wahl. Manchmal bin ich aber auch ganz einfach vernagelt. Danke jedenfalls.
Traude.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
aus der Delphi-Hilfe:
Zitat:
Die Methode InitInstance setzt alle Speicherzellen in dem für ein neues Objekt reservierten Bereich auf Null und initialisiert den Zeiger auf die Tabelle der virtuellen Methoden der Instanz.
Und was soll ich damit machen? Den Zeiger für die VMT manipulieren? Lieber nicht.
Einfach die virtuelle methode überschreiben, du kannst jeder beliebige TObject zurückgeben (auch nil nehme ich an). Wäre auch zum implementieren eines singleton ganz interessant. kA obs .NET kompatibel ist.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.