![]() |
AW: interface und variable des implementierenden objekts
Ein untypisierter Parameter für die Rückgabe eines Interface scheint mir sehr verdächtig.
Wird hier eventuell die Referenzzählung ausgetrickst? Warum nicht so:
Delphi-Quellcode:
procedure TCustomDataModule.GetLink(out Link: IDataChangeLink);
begin Link := FLink; end; |
AW: interface und variable des implementierenden objekts
Zitat:
Und das Ergebnis des Ganzen? Speicherlecks. Denn ist vorher schon was in dem Link-Parameter drin, dann wird es ignoriert und nicht freigegeben. Für eine automatische Referenzzählung ist das OUT hier also der nahezu sichere Tot. |
AW: interface und variable des implementierenden objekts
Zitat:
// EDIT: Nicht einmal bei Delphi 2007 passiert das bei mir. // EDIT2: Und auch bei Delphi 3 nicht. Das heißt so allgemein lässt sich das auf jeden Fall nicht sagen. Ich bekomme das nicht hin, dass das Problem auftritt. |
AW: interface und variable des implementierenden objekts
OUT-Parameter sind Ausgabeparameter und da werden Eingangswerte nicht beachtet.
Dieses Problem sollte also immernoch bestehen. Wenn nicht und Emba hat dieses Verhalten geändert, dann ist das ein Bug und Emba hat das gefälligst wieder auszubauen. :roll: "Böse" ist eigentlich, daß der Eingangswert des Ausgangsparameters beachtet wird, was eigentlich nicht gemacht werden dürfte. :gruebel: const/in = in ... ingibt es in Delphi nicht, aber es entspricht quasi dem Parameter ohne eine Angabe von var/out/const var = in&out out = out Gut, Delphi scheint das Interface die Variable, vor Übergabe an den OUT-Parameter, freizugeben. Letzteres SetOutI müßte in etwa das tun, was diese WMI-Schnittstelle macht ... also den Eingangsparameter zu ignorieren. Was sagt denn ein älteres Delphi zu dem Code?
Delphi-Quellcode:
type
TTestIntf = class(TInterfacedObject, IInterface) FStrings: TStrings; constructor Create(SL: TStrings); destructor Destroy; override; end; constructor TTestIntf.Create(SL: TStrings); begin inherited Create; FStrings := SL; FStrings.Add('TTestIntf.Create ' + IntToHex(Integer(Self), 8)); end; destructor TTestIntf.Destroy; begin FStrings.Add('TTestIntf.Destroy ' + IntToHex(Integer(Self), 8)); inherited; end; procedure TForm6.SetVar(var Intf: IInterface); begin Memo1.Lines.Add('SetVar begin'); Intf := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('SetVar end'); end; procedure TForm6.SetOut(out Intf: IInterface); begin Memo1.Lines.Add('SetOut begin'); IInterface(Intf) := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('SetOut end'); end; procedure TForm6.SetVarD(var Intf); begin Memo1.Lines.Add('SetVarD begin'); IInterface(Intf) := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('SetVarD end'); end; procedure TForm6.SetOutD(out Intf); begin Memo1.Lines.Add('SetOutD begin'); IInterface(Intf) := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('SetOutD end'); end; procedure TForm6.SetOutI(out Intf); var I: IInterface; begin Memo1.Lines.Add('SetOutI begin'); I := TTestIntf.Create(Memo1.Lines); I._AddRef; Pointer(Intf) := Pointer(I); Memo1.Lines.Add('SetOutI end'); end; var Intf: IInterface; Memo1.Lines.Add(''); Memo1.Lines.Add('create test-interface'); Intf := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('call SetVar'); SetVar(Intf); Memo1.Lines.Add('set nil'); Intf := nil; Memo1.Lines.Add(''); Memo1.Lines.Add('create test-interface'); Intf := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('call SetOut'); SetOut(Intf); Memo1.Lines.Add('set nil'); Intf := nil; Memo1.Lines.Add(''); Memo1.Lines.Add('create test-interface'); Intf := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('call SetVarD'); SetVarD(Intf); Memo1.Lines.Add('set nil'); Intf := nil; Memo1.Lines.Add(''); Memo1.Lines.Add('create test-interface'); Intf := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('call SetOutD'); SetOutD(Intf); Memo1.Lines.Add('set nil'); Intf := nil; Memo1.Lines.Add(''); Memo1.Lines.Add('create test-interface'); Intf := TTestIntf.Create(Memo1.Lines); Memo1.Lines.Add('call SetOutI'); SetOutI(Intf); Memo1.Lines.Add('set nil'); Intf := nil; |
AW: interface und variable des implementierenden objekts
Zitat:
Zitat:
Code:
Ich würde mal sagen alles ok, oder?
create test-interface
TTestIntf.Create 008A3738 call SetVar SetVar begin TTestIntf.Create 008A3750 TTestIntf.Destroy 008A3738 SetVar end set nil TTestIntf.Destroy 008A3750 create test-interface TTestIntf.Create 008A3738 call SetOut TTestIntf.Destroy 008A3738 SetOut begin TTestIntf.Create 008A3738 SetOut end set nil TTestIntf.Destroy 008A3738 create test-interface TTestIntf.Create 008A3738 call SetVarD SetVarD begin TTestIntf.Create 008A3750 TTestIntf.Destroy 008A3738 SetVarD end set nil TTestIntf.Destroy 008A3750 create test-interface TTestIntf.Create 008A3738 call SetOutD TTestIntf.Destroy 008A3738 SetOutD begin TTestIntf.Create 008A3738 SetOutD end set nil TTestIntf.Destroy 008A3738 create test-interface TTestIntf.Create 008A3738 call SetOutI TTestIntf.Destroy 008A3738 SetOutI begin TTestIntf.Create 008A3738 SetOutI end set nil TTestIntf.Destroy 008A3738 |
AW: interface und variable des implementierenden objekts
Zitat:
Ich kann da ebensowenig ein Fehlverhalten des Compilers erkennen. |
AW: interface und variable des implementierenden objekts
in etwa so hatte ich das auch verstanden & beim debuggen auch gesehen. ich dachte halt, dies ist der sicherste weg die referenzzählung am leben zu halten, selbst wenn man ma ne interfacevariable übergibt die noch belegt ist.
aber hat jetzt jemand von euhc auch mal dieses mysteriöse verhalten das ich anfangs beschrieben hatte bemerkt? oder etwas ähnliches, dass sich im schlimmsten fall nur durch einen neustart des gesamten computers beheben lässt? ich habe damit wirklich ein problem dass ich so nicht lösen kann, insbesondere da dritte mit diesem programm arbeiten sollen und es im moment auch schon tun und es einfach nicht sein kann, dass in manchen momenten (soweit ich das beurteilen kann nicht vorhersehbar) wertezuweisungen einfach verworfen werden... falls nicht, kennt jemand möglichkeiten, wie man solchen problemen auf den grund gehen kann??? es kann ja durchaus meine eigene dummheit an irgendeiner anderen stelle sein... |
AW: interface und variable des implementierenden objekts
Erstell ein Minimalprojekt, bei dem der Fehler auftritt und entferne so lange Teile, bis der Fehler nicht mehr auftritt.
Wenn du nicht weiter kommst, stellst du die Quellen für das Minimalprojekt hier rein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz