AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Warum zerstören sich meine Classen
Thema durchsuchen
Ansicht
Themen-Optionen

Warum zerstören sich meine Classen

Ein Thema von EWeiss · begonnen am 21. Mär 2011 · letzter Beitrag vom 23. Mär 2011
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#21

AW: Warum zerstören sich meine Classen

  Alt 22. Mär 2011, 15:31
Da ist eure Meinung gefragt.
Meine Meinung? - Einfach die Interfaces richtig verwenden und schon klappt das.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Patito

Registriert seit: 8. Sep 2006
108 Beiträge
 
#22

AW: Warum zerstören sich meine Classen

  Alt 22. Mär 2011, 15:44
Boa, seid ihr alle gruselig...

1) Wer versucht Free in ein Interface aufzunehmen hat die zugrundeliegende Problematik von Interfaces in Delphi nicht verstanden - sowas führt auf direktem Weg zu einer AV: 6 - setzen!
Prüft mal eure Programme auf Zugriffe auf freigegebenen Speicher...

2) Objekte mit Interfaces zerstören sich nicht selber wenn der RefCount 0 wird.
Es wird lediglich _Release() aufgerufen.
Nur wenn man von einer Klasse ableitet, die in _Release() den Destructor aufruft (z.B. TInterfacedObject) zerstört sich das Object bei RefCount 0.

3) Objekte freigeben, auf die es noch irgendwelche Interface-Referenzen gibt ist *VERBOTEN*.
Tut man es trotzdem, wird später wenn die Interface-Referenz gelöscht wird das _Release() des bereits freigegebenen Objektes aufgerufen.

Zur Lösung des Problems: Vermutlich hilft hier eine Wrapper-Klasse, die sich um die Erstellung und das Aufräumen kümmert.
Z.B. wäre es auch ganz nett die zugehörige Arbeit zum Erstellen und Aufräumen innerhalb der DLL in eigene Init und Exit Prozeduren (ohne Interfaces) auszulagern.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#23

AW: Warum zerstören sich meine Classen

  Alt 22. Mär 2011, 15:52
Ich sagte doch: Interfaces richtig benutzen. Das hier ist ein Quick&Dirty, vor allem Dirty, Workaround, der es dem TE erleichtern soll, das ganze zu managen, weil scheinbar immernoch ein paar Probleme mit Interfaces und deren Benutzung existieren.

Bernhard
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#24

AW: Warum zerstören sich meine Classen

  Alt 22. Mär 2011, 16:01
Zitat:
weil scheinbar immernoch ein paar Probleme mit Interfaces und deren Benutzung existieren.
Dann erkläre es mir doch wenn es nicht zuviel von deiner Zeit in Anspruch nimmt.
Der TE ist kein professioneller Programmierer und schon gar nicht Informatiker.
Berücksichtige das Bitte!

Ich stelle nur Fragen wenn Sie beantwortet werden freut es mich natürlich.
Soll aber nicht heißen das jemand für mein Hobby (Arbeiten soll).

Es ist der Sinn eines Forums das man sich dort informiert um zu lernen.
Und was an meiner letzten Frage jetzt so unverständlich war bzw.. was es damit zu tun hat es mir leichter zu machen
verstehe ich jetzt nun wirklich nicht.

Ich habe gefragt ob sich das ändern der Interface auf den Speicher auswirkt.
Was war da nun so tragisch

gruss
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#25

AW: Warum zerstören sich meine Classen

  Alt 22. Mär 2011, 16:08
das soll jetzt aber nicht zum persönlichen Angriff mutieren. Außerdem hatte ich gedacht, dass die bis jetzt erarbeitete Lösung so halbwegs funktioniert und deinen Ansprüchen fürs erste genügt. Ich habe mich noch nie damit beschäftigt, wie man Interfaces einsetzt um ganze Objekte zwischen DLL und EXE auszutauschen, ich kann also nur Tipps geben, wie und ob das funktioniert, kann ich nicht 100%ig sagen.

Bernhard

PS: Es klingt nur für mich komisch, dass die zuerst angesprochene Version nicht funktioniert, wobei die gerade das Non-Plus-Ultra ist.
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#26

AW: Warum zerstören sich meine Classen

  Alt 22. Mär 2011, 16:10
Zitat:
das soll jetzt aber nicht zum persönlichen Angriff mutieren.
Nicht falsch verstehen... Auf keinen Fall
Das war kein Angriff auf deine Person.

Danke nochmal für deine Hilfe.

PS:
Möchte halt nur verstehen wie das alles zusammenhängt.
Wo soll ich denn fragen wenn nicht hier

gruss
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#27

AW: Warum zerstören sich meine Classen

  Alt 23. Mär 2011, 09:56
Free in das Interface aufzunehmen oder das Objekt über eine andere Methode des Interface freizugeben ist problematisch. Es existiert zu diesem Zeitpunkt zumindest diese eine Interfacevariable. Danach wird irgendwann der Gültigkeitsbereich für diese Variable verlassen, das übergeordnete Objekt freigegeben, bzw. der Interface-Variable NIL oder ein anderer Wert zugewiesen.
Dabei wird automatisch über das Interface "_Release" des implementierenden Objects aufgerufen.
Delphi-Quellcode:
function TInterfacedPersistent._Release: Integer;
begin
  if FOwnerInterface <> nil then
    Result := FOwnerInterface._Release else
    Result := -1;
end;
Da der versteckt übergebene Parameter Self auf ein nicht mehr existierendes Objekt verweist, kann der implizite Zugriff auf Self.FOwnerInterface zur Zugriffsverletzung führen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#28

AW: Warum zerstören sich meine Classen

  Alt 23. Mär 2011, 15:08
Free in das Interface aufzunehmen oder das Objekt über eine andere Methode des Interface freizugeben ist problematisch. Es existiert zu diesem Zeitpunkt zumindest diese eine Interfacevariable. Danach wird irgendwann der Gültigkeitsbereich für diese Variable verlassen, das übergeordnete Objekt freigegeben, bzw. der Interface-Variable NIL oder ein anderer Wert zugewiesen.
Dabei wird automatisch über das Interface "_Release" des implementierenden Objects aufgerufen.
Delphi-Quellcode:
function TInterfacedPersistent._Release: Integer;
begin
  if FOwnerInterface <> nil then
    Result := FOwnerInterface._Release else
    Result := -1;
end;
Da der versteckt übergebene Parameter Self auf ein nicht mehr existierendes Objekt verweist, kann der implizite Zugriff auf Self.FOwnerInterface zur Zugriffsverletzung führen.
Habe auf grund ähnlicher vermutung die Free proceduren auch wieder entfernt.
Denke das Windows das Automatisch übernimmt wenn das Programm geschlossen wird.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz