Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ungültige Zeigeroperation bei destroy (https://www.delphipraxis.net/45921-ungueltige-zeigeroperation-bei-destroy.html)

der-C 14. Mai 2005 15:37


ungültige Zeigeroperation bei destroy
 
hallo,

ich hab den oben genannten fehler.

zum Programm:
es ist eine exe welche ein Form aus einer dll läd.
in der dll habe ich zwei Klassen deklariert:
eine Listenklasse welche Instanzen der anderen klasse enthält.

wenn ich diese Klasse freigebe wird für jeder Instanz die sie enthält free aufgerufen.
das klappt bei allen bis auf eine Instanz.
bei dieser wird im destruktor der oben genannte fehler ausgegeben (und zwar zwischen dem letzten befehl und end;)

Code:
destructor myclass.Destroy;
begin
...
dummybefehl;   // wenn ich hier einen Schritt weiter gehe kommt der Fehler
end;
Code:
type
  myclass=class;
  ...
  end;

type
   mylist=class
   private
     list: array of TMyClass;
   ...
   end;
sharemem hab ich schon probiert, sowol nur in der dll als auch in der exe oder in beiden, hat nichts geändert.
alles was ich free gebe setze ich hinterher auch nil.

jemand ne Ahnung? Danke.

Muetze1 14. Mai 2005 15:42

Re: ungültige Zeigeroperation bei destroy
 
Moin!

Bei dem Code:

Delphi-Quellcode:
destructor myclass.Destroy;
begin
  ...
  dummybefehl;   // wenn ich hier einen Schritt weiter gehe kommt der Fehler
end;
Wo kommt da das Inherited Destroy? Vor oder nach dem DummyBefehl??

MfG
Muetze1

Pseudemys Nelsoni 14. Mai 2005 15:42

Re: ungültige Zeigeroperation bei destroy
 
und wie sieht dummybefehl aus?

der-C 14. Mai 2005 15:48

Re: ungültige Zeigeroperation bei destroy
 
das inherited Destroy kommt nach dem dummybefehl
ich wollt damit nur ausdrücken das es egal ist welchen Befehl ich als letztes aufrufe. Der Fehler kommt immer wenn ich ein Befehl weiter gehe, also zum end;

alzaimar 14. Mai 2005 15:54

Re: ungültige Zeigeroperation bei destroy
 
Sowas passiert, wenn die Instanz 2x freigegeben wird, und im Destruktor z.B. Felder der Klasse Bezug genommen wird. Mir ist noch nicht aufgefallen, das das beim Return (also dem 'end') auch auftritt, aber wer weiss.
Beispiel:
Delphi-Quellcode:
a := TFooBar.Create;
...
a.Destroy;
a.Destroy; // <--- Oha
Abhilfe: Vermeiden von Destroy, und Benutzen der Routine FreeAndNil.
Delphi-Quellcode:
a := TFooBar.Create;
...
FreeAndNil(a);
a.Free; // <--- Macht nix, weil <Nil>.Free gar nichts macht.

Muetze1 14. Mai 2005 15:55

Re: ungültige Zeigeroperation bei destroy
 
Moin!

Zitat:

Zitat von der-C
das inherited Destroy kommt nach dem dummybefehl
ich wollt damit nur ausdrücken das es egal ist welchen Befehl ich als letztes aufrufe. Der Fehler kommt immer wenn ich ein Befehl weiter gehe, also zum end;

Es ist zumindest wichtig, das du vor dem Inherited Destroy überall aufräumst und nicht mehr nach dem Inherited beim Destroy. Und die Frage ist wirklich, wie denn der DummyBefehl aussieht. Wenn es wirklich egal ist welcher Befehl, dann liegt dein Fehler woanders und es wird dein Speicher zerschossen nur beim Destroyy nutzt er diesen zerschossenen Speicher und krepiert. Und warum nutzt du keine TObjectList anstatt Array Of TObject ? Da würde dann auch einfach nur eine ObjectList.Free; im Destroy deiner Hauptklasse reichen...

Warnung hast du auch keine und Destroy ordentlich mit Override überschrieben?

MfG
Muetze1

der-C 14. Mai 2005 16:06

Re: ungültige Zeigeroperation bei destroy
 
@alzaimar
freeandnil() müstte doch dasselbe sein wie
meinobject.free;
meinobject := nil;
oder?

@Muetze1
- Ja ich räume vor inherited destroy auf
- TObjectlist: wenn ich auf die Memberfunktionen zugreifen will muss ich immer soviel Casten und die Listenklasse kann noch ein wenig mehr als nur objekte verwalten.
- destroy habe ich mit override überschrieben.

das Problem tritt ja auch nur bei einem element auf, alle anderen werden problemlos destroyt

kann das was mit der dll zutun haben?
Instanzen der klassen Verlassen die dll jedoch nie, spielt sich alles inerhalb der dll ab.(also create und destroy)

Pseudemys Nelsoni 14. Mai 2005 16:11

Re: ungültige Zeigeroperation bei destroy
 
Es kann auch an deiner Prozedur im destructor sein, aber da du sie ja nicht zeigen willst...

der-C 14. Mai 2005 16:19

Re: ungültige Zeigeroperation bei destroy
 
Code:
destructor MyClass.Destroy;
begin
  comp.free; // ist ein TEdit
  comp:=nil;
  complabel.free; //ist ein TLabel
  complabel := nil;
  DataStream.Position :=0;
  DataStream.free;
  Datastream := nil;
  inherited Destroy;
end;
ich habe auf dem nächstem behehl nach dem Rücksprung ein breakpoint, jedoch kommt er da nie hin???


so ich habs jetzt mal ohne dll getestet, da funktioniert alles ohne Probleme
ich brauchs aber in der dll??

alzaimar 14. Mai 2005 20:17

Re: ungültige Zeigeroperation bei destroy
 
FreeAndNil = a.free; a:=Nil--- korrekt.

Wenn es nur in der DLL wegballert, vielleicht hast Du irgendwo strings? Du kennst doch das Problem mit der Strings-Verwaltung und DLL?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.
Seite 1 von 2  1 2      

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