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:
sharemem hab ich schon probiert, sowol nur in der dll als auch in der exe oder in beiden, hat nichts geändert.
type
myclass=class; ... end; type mylist=class private list: array of TMyClass; ... end; alles was ich free gebe setze ich hinterher auch nil. jemand ne Ahnung? Danke. |
Re: ungültige Zeigeroperation bei destroy
Moin!
Bei dem Code:
Delphi-Quellcode:
Wo kommt da das Inherited Destroy? Vor oder nach dem DummyBefehl??
destructor myclass.Destroy;
begin ... dummybefehl; // wenn ich hier einen Schritt weiter gehe kommt der Fehler end; MfG Muetze1 |
Re: ungültige Zeigeroperation bei destroy
und wie sieht dummybefehl aus?
|
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; |
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:
Abhilfe: Vermeiden von Destroy, und Benutzen der Routine FreeAndNil.
a := TFooBar.Create;
... a.Destroy; a.Destroy; // <--- Oha
Delphi-Quellcode:
a := TFooBar.Create;
... FreeAndNil(a); a.Free; // <--- Macht nix, weil <Nil>.Free gar nichts macht. |
Re: ungültige Zeigeroperation bei destroy
Moin!
Zitat:
Warnung hast du auch keine und Destroy ordentlich mit Override überschrieben? MfG Muetze1 |
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) |
Re: ungültige Zeigeroperation bei destroy
Es kann auch an deiner Prozedur im destructor sein, aber da du sie ja nicht zeigen willst...
|
Re: ungültige Zeigeroperation bei destroy
Code:
ich habe auf dem nächstem behehl nach dem Rücksprung ein breakpoint, jedoch kommt er da nie hin???
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; so ich habs jetzt mal ohne dll getestet, da funktioniert alles ohne Probleme ich brauchs aber in der dll?? |
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? |
Re: ungültige Zeigeroperation bei destroy
Wenn du die Instanzen in deinem Constructor erzeugt, gibst du den Unterkomponenten da eigentlich auch noch einen Owner mit? Wenn ja, dann würde dieser Owner nämlich auch noch einmal zusätzlich eine Freigabe dieser Teilkomponenten versuchen...
|
Re: ungültige Zeigeroperation bei destroy
@alzaimar
die dll exportiert nur eine funktion welche das form startet. innerhalb der dll benutze ich Strings, das müsste doch gehen ?? (ich werd aber jetzt mal probieren alles mit shortstring oder pchar zu machen) @TStringlist die Combonenten haben alle owner := nil aber der Parent ist natürlich <> nil aber das dürfte doch kein Probleme machen? wenn ich in der Liste 4 Elemente habe tritt der Fehler nur beim destroyen vom Element 3 auf bei 10 Elementen ist es Element 8 welches nicht geht. selbst nach neustart des PCs ist es immer dasselbe element welches den Fehler auslöst |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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