AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ungültige Zeigeroperation bei destroy

Ein Thema von der-C · begonnen am 14. Mai 2005 · letzter Beitrag vom 14. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
der-C

Registriert seit: 29. Okt 2004
68 Beiträge
 
Delphi 6 Professional
 
#1

ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 16:37
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 16:42
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
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#3

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 16:42
und wie sieht dummybefehl aus?
Mario
  Mit Zitat antworten Zitat
der-C

Registriert seit: 29. Okt 2004
68 Beiträge
 
Delphi 6 Professional
 
#4

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 16:48
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;
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 16:54
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 16:55
Moin!

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
  Mit Zitat antworten Zitat
der-C

Registriert seit: 29. Okt 2004
68 Beiträge
 
Delphi 6 Professional
 
#7

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 17:06
@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)
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#8

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 17:11
Es kann auch an deiner Prozedur im destructor sein, aber da du sie ja nicht zeigen willst...
Mario
  Mit Zitat antworten Zitat
der-C

Registriert seit: 29. Okt 2004
68 Beiträge
 
Delphi 6 Professional
 
#9

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 17:19
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??
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: ungültige Zeigeroperation bei destroy

  Alt 14. Mai 2005, 21:17
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?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:33 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