AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Methode "Free" selbst implementieren (Assembler-Problem?)
Thema durchsuchen
Ansicht
Themen-Optionen

Methode "Free" selbst implementieren (Assembler-Problem?)

Ein Thema von VizeTE · begonnen am 22. Feb 2005 · letzter Beitrag vom 15. Mär 2005
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#1

Methode "Free" selbst implementieren (Assembler-Pr

  Alt 22. Feb 2005, 12:56
Hallo,

Alle von TObject abgeleiteten Klassen können per Free freigegeben werden ohne das es zu einer Exception kommt falls das entprechende Objekt nicht instanziert wurde/nil ist. Ich möchte selbst ein Free implementieren ohne diese Eigenschaft zu verlieren.
Bisher habe ich folgenden Code
Delphi-Quellcode:
TMyList = class(TList)
protected
  FDoSomething : boolean;
public
  destructor Destroy; override;
  procedure Free(DoSomething : boolean); reintroduce;
end;

destructor TMyList.Destroy;
begin
  if FDoSomething then
  begin
    ...do something...
  end;
  inherited;
end;

procedure TMyList.Free(DoSomething: boolean);
asm
  TEST EAX,EAX
  JE @@exit
  MOV ECX,[EAX]
  MOV DL,1
  CALL dword ptr [ECX].vmtDestroy
  @@exit:
end;
Den Assembler-Code habe ich mir von TObject kopiert ohne wirklich zu wissen was er macht (wobei man die ersten beiden und letzten beiden Zeile ja erahnen kann). Das funktioniert auch soweit.
Falls der Parameter "DoSomething" der Methode "Free" gesetzt (wahr) ist soll in "Destroy" entsprechend reagiert werden.
Was ich jetzt nicht weiß ist wie ich meine Objektvariable in "Free" entsprechend dem Parameter setzen kann.

Falls jemand eine Idee hat oder mir sagen kann wo ich sowas nachlesen kann oder einen einfacheren Ansatz hat würde ich mich freuen :lol:
(Die Variable vor dem Aufruf von "Free" per property zu setzen würde sicher auch gehen, daß wollte ich aber vermeiden damit der Programmieren das nicht vergessen kann)

Ciao
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 13:07
Wieso den komplizierten Assembler hernehmen? So gehts doch auch, und dein Problem löst es gleich mit

Delphi-Quellcode:
destructor TMyList.Destroy(DoSomething: boolean);
begin
  if Self <> nil then
  begin
    fDoSemthing := DoSomething;
    Destroy;
  end
end;
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#3

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 13:12
1. Würde ich diese Funktion nicht Free nennen. Früher oder Später wird es nur Verwirrungen geben.

2. Kannst du ganz einfach mit

if Self=nil then die Prüfung machen.

3. Entfällt 2 dann, weil du Free direkt aufrufen kannst, wenn du deiner Funktion einen anderen Namen gibts.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 13:17
Schau mal dort rein, da dein Free jetzt einen Parameter besitzt, wird da vom Compiler noch zusätzlicher Code eingefügt, welcher jetzt vermutlich mit deinem AssemblerCode etwas in Konflickt gerät.

Inline Assembler und automatische Optimierung?



(oder du hast einfach nur einen Fehler beim Abschreiben gemacht)
$2B or not $2B
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 13:44
@Dax

In der Tat, einfacher geht es nicht. (Wobei ich dann die Prüfung in der Methode "Free" durchführe, aber ich denke das wolltest du auch schreiben da du innerhalb des if-Blockes ja Destroy aufrufst) Als ich rumgetestet habe und noch Pascal statt Assembler verwendete hatte ich Free wohl noch als virtual gekennzeichnet. Von daher ging das nicht (Exception beim Aufruf ohne in die Methode zu springen). Dann habe ich wohl den Assembler-Code kopiert und das virtual entfernt und die Schuld fälschlicherweise auf den Pascal-Code geschoben)

@jim_raynor

Mein Gedanke bei der Benennung der Methode war halt der, daß jeder weiß, daß er ein instantiertes Objekt wieder mit Free freigeben muß. Wenn man dieses Objekt benutzt und Free aufruft meckert dann der Compiler, daß der Parameter fehlt. So weiß derjenige dann:
1. ja, er muß Free aufrufen
2. zum Aufruf ist ein Parameter nötig (der dann natürlich nicht DoSomething heißt sondern erkennen läßt was er tut!)
Natürlich fehlt dann hier noch "inherited Free;", sodaß meine Methode jetzt so aussieht:
Delphi-Quellcode:
procedure TMyList.Free(ADoSomething: boolean);
begin
  if Self <> nil then
  begin
    FDoSomething := ADoSomething;
    inherited Free;
  end;
end;
Deshalb habe ich ja auch "Free" mit reintroduce" gekennzeichnet. Somit gibt es nur das eine "Free" und Verwirrungen sind somit minimiert. (Zumindest würde es mich mehr verwirren wenn es auf einmal 2 Free-Methoden gibt!)

Ich denke so sollte das gehen. Falls noch Einwände bestehen würde ich mich über Eure Meinung freuen.

PS: Vielen Dank für die superkurze Antwortzeit!
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 13:51
@himitsu

Noch ein Grund das ohne Assembler zu lösen
Wie gesagt, ich habe keine Ahnung von Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#7

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 14:04
Benenne die Methode trotzdem nicht Free, weil Free von Delphi an den verschiedensten Stellen genutzt wird und dabei von der Festen "Methoden-Signatur" ohne Parameter ausgegangen wird. Wenn die Free jetzt Parameter gibt (warum eigentlich), dann machst Du es für andere Entwickler nur umständlicher mit Deinen Objekten zu arbeiten.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 14:25
Aber warum willst du eigentlich ein eigenes Free ?
Michael
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#9

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 15:22
@Neutral General

Zitat:
Aber warum willst du eigentlich ein eigenes Free ?
Weil ich einen Parameter übergeben möchte und dabei vermieden werden soll,daß es viele Free-Methoden gibt. Normalerweise sieht man je wegen einem Free nicht extra in der Dokumentation nach was das tolles macht oder nicht macht sondern schreibt es einfach hin und gut. Wenn es aber nur meine Free gibt dann sieht das halt anders aus.


@sakura

Zitat:
enenne die Methode trotzdem nicht Free, weil Free von Delphi an den verschiedensten Stellen genutzt wird und dabei von der Festen "Methoden-Signatur" ohne Parameter ausgegangen wird.
Wäre es denn ok wenn ich den Parameter einen Defaultwert geben und mein Free somit wie das ursprüngliche Free aufgerufen werden kann? Wäre zwar nicht ganz in meinem Sinne aber, in meinen Augen, ein funktionierender Kompromiß.
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: Methode "Free" selbst implementieren (Assemble

  Alt 22. Feb 2005, 15:26
Folgende "einfache" Lösung ist auch möglich.

Delphi-Quellcode:
TMyList = class(TList)
public
  DoSomething : boolean;
  destructor Destroy; override;
end;

destructor TMyList.Destroy;
begin
  if DoSomething then
  begin
    ...do something...
  end;
  inherited;
end;
Dann kannst Du einfach mit folgenden Zeilen Deinen Zweck erfüllen.
Delphi-Quellcode:
...
var
  ml : TMyList;
...
begin
  ...
  ml := TMyList.Create;
  ...
  ml.DoSomething := True;
  ...
  ml.Free;
  ml := Nil;
  ...
end;
...
Die "ml := Nil" Zeile habe ich mir angewöhnt, da ein Free prüft ob das Objekt <> nil ist und es in diesem Fall freigibt. Danach ist aber das Objekt zwar freigegeben, aber nicht nil. Der Pointer zeigt immer noch auf die Spericherstelle wo das Objekt mal war. Ein erneuter Aufruf von Free kann dann Probleme machen.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 15:42 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