Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SOAP RIO Object Free Fehler (https://www.delphipraxis.net/166611-soap-rio-object-free-fehler.html)

Mavarik 21. Feb 2012 18:28

SOAP RIO Object Free Fehler
 
Hallo Zusammen...

Ich habe einen komischen Fehler...

Folgenden Source:

Delphi-Quellcode:
constructor TMasterbaseTest.Create;
begin
  inherited;
  FHTTPRIO := THTTPRIO.Create(Application);
  FHTTPRIO.WSDLLocation := GlobalServer+'/cgi-bin/meinService.dll/wsdl/IMainService';
  FHTTPRIO.Service     := 'IMainService';
end;

destructor TMasterbaseTest.Destroy;
begin
  FHttPRIO.Free; <--- EXCEPTION
end;
Ersetze ich jetzt im Create, Application durch NIL... Kein Fehler mehr...

Delphi-Quellcode:
 FHTTPRIO := THTTPRIO.Create(NIL);
Object wir nur Create/Free sonst keine Operationen...

Jemand ne Idee?

Grüsse Mavarik

daywalker9 21. Feb 2012 18:37

AW: SOAP RIO Object Free Fehler
 
HTTPRio ist doch ein Interface, einfach auf nil setzen anstatt free aufzurufen.

shmia 21. Feb 2012 18:49

AW: SOAP RIO Object Free Fehler
 
Das Free bewirkt, dass die virtuelle Methode [TComponent].Notification() aufgerufen wird.
Ausserdem werden alle Komponenten, die der Komponente Application gehören (also die Child-Components) benachrichtigt.
Und natürlich werden auch die Kinder der Kinder benachrichtigt.
Hier der entscheidende Ausschnitt aus dem Code:
Delphi-Quellcode:
procedure TComponent.Notification(AComponent: TComponent;
  Operation: TOperation);
var
  I: Integer;
begin
  if (Operation = opRemove) and (AComponent <> nil) then
    RemoveFreeNotification(AComponent);
  if FComponents <> nil then
    for I := 0 to FComponents.Count - 1 do
      // Rekursiver Aufruf!!
      TComponent(FComponents[I]).Notification(AComponent, Operation);
end;
Ich weiss jetzt nicht, welche Komponenten "Application" als Owner haben, aber es geht im Prinzip ein Broadcast an alle diese Komponenten.
Irgendeine Komponente könnte das "in den falschen Hals bekommen".

Wegen dieser Eskalation an Notification()-Aufrufen sollte man "Application" nicht als Owner angeben.

Mavarik 21. Feb 2012 19:25

AW: SOAP RIO Object Free Fehler
 
Zitat:

Zitat von daywalker9 (Beitrag 1152188)
HTTPRio ist doch ein Interface, einfach auf nil setzen anstatt free aufzurufen.

Nein eigentlich nicht...

I.d.R. ist HttpRio doch eine Komponente die Du aufs Formular klicks...
Auf NIL setzten reicht nicht... sonst liefert : ReportMemoryLeaksOnShutDown := true;

Ganz viel was nicht "geFree'd" wurde...

Grüsse Mavarik

Mavarik 21. Feb 2012 19:33

AW: SOAP RIO Object Free Fehler
 
PS:Ganz vergessen, Sorry!

Delphi-Quellcode:
constructor TMasterbaseTest.Create;
var
  InterfaceVariable : IMainService;
 begin
   inherited;
   FHTTPRIO := THTTPRIO.Create(NIL); // <--- NIL!!
   FHTTPRIO.WSDLLocation := GlobalServer+'/cgi-bin/meinService.dll/wsdl/IMainService';
   FHTTPRIO.Service := 'IMainService';
   InterfaceVariable := FHTTPRIO as IMainService; // NEU!
 end;
Erzeugt auch beim Free eine Exception!

Mavarik

himitsu 21. Feb 2012 19:56

AW: SOAP RIO Object Free Fehler
 
Was hat TMasterbaseTest als Vorfahr?

TMasterbaseTest ist schließlich der Ersteller dieses THTTPRIO, also sollte es auch der Owner sein.
Aber nur, wenn FHTTPRIO ein Objektzeiger bleibt und nirgendwo eine Interfaceinstanz verwendet wird.
(durch die Owner-Beziehung bräucht man das Free dann nicht, da es dadurch ja sowieso freigegeben wird)

Ist FHTTPRIO ein Interfacezeiger, was es sein sollte, wenn irgendwo über ein Interface auf dieses Objekt zugegriffen wird, dann sollte es keinen Owner geben, da über die Interfacevariablen (Referenzzählung) die Freigabe geregelt werden sollte.

Keldorn 21. Feb 2012 20:14

AW: SOAP RIO Object Free Fehler
 
Hallo

andere kleine Frage: was für eine Exception erhälst du?

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:31 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