AGB  ·  Datenschutz  ·  Impressum  







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

Zugriffsverletzung bei free?

Ein Thema von Hyperspacer · begonnen am 4. Mär 2007 · letzter Beitrag vom 8. Mär 2007
Antwort Antwort
Seite 2 von 2     12   
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Zugriffsverletzung bei free?

  Alt 5. Mär 2007, 08:29
Zitat von xaromz:
nur um das geradezurücken:
Zitat von SirTwist:
Mit diesem Code hier:
Delphi-Quellcode:
with TEdit.Create(form1) do begin
  ...
end;
legst Du zwar ein TEdit an und initialisierst du es, aber direkt nach dem End wird es wieder freigegeben, weil du es keiner Variablen zuweist. [...]
Diese Aussage ist natürlich Blödsinn. Das Objekt wird nicht freigegeben (Delphi-Klassen besitzen keine Referenzzählung und Delphi hat auch keinen GC). Es existiert nur keine Variable, mit der das Objekt angesprochen werden kann.
Ich setze noch einen drauf.

Zitat von SirTwist:
Wenn Du schon Controls on-the-fly erzeugen willst, musst Du sie in einer Variable speichern, und zwar keiner lokalen innerhalb der Prozedur, sondern innerhalb der aktuellen Klasse/des aktuellen Forms:
Delphi-Quellcode:
  tmp_edit := TEdit.Create(form1);
  with tmp_edit do begin
    tmp_edit.Parent := form1;
  end;
Nur der Vollständigkeit halber: Müssen muss er das nicht.

Da bei ihm Form1 der Owner vom Edit ist, ist das Edit über die Liste Form1.Components referenzierbar. Und weil Form1 der Parent vom Edit ist, ist das Edit ebenfalls in Form1.Controls greifbar. Dazu sollte allerdings sinnigerweise Edit.Name beim Createn belegt werden.


Zitat von SirTwist:
und dann spätestens im FormClose-Event:
  FreeAndNil(tmp_edit);
Auch nein. Weil das Form1 hier der Owner vom Edit ist, würde das Edit automatisch beim Freigeben der Form1 auch freigegeben werden.
Objekte vom Typ TComponent (bzw. dessen Ableitungen) zerstören die Komponenten, deren Owner sie sind, bei ihrer eigene Freigabe immer mit.
  Mit Zitat antworten Zitat
SirTwist

Registriert seit: 28. Sep 2006
198 Beiträge
 
Delphi XE Professional
 
#12

Re: Zugriffsverletzung bei free?

  Alt 5. Mär 2007, 11:35
Jepp, Ihr habt natürlich recht

Daran, dass das Control durch die Zuweisung des Parents in die Control-Liste des Parents aufgenommen wird, habe ich wirklich nciht gedacht.

Und dass ein Objekt einfach so im Raum stehen bleibt, auch ohne jede Referenzierung... nun, ich bin bislang immer vom Gegenteil ausgegangen, habe das gerade mal überprüft und Du hast natürlich recht. Das habe ich wohl von Perl falsch übernommen.
  Mit Zitat antworten Zitat
Hyperspacer

Registriert seit: 23. Apr 2006
53 Beiträge
 
Delphi 7 Personal
 
#13

Re: Zugriffsverletzung bei free?

  Alt 7. Mär 2007, 20:16
Okay also das problem an sich hab ich jetzt mit einem unsichtbaren edit umgangen, das ich verschiebe und sichtbar mache wenn ich es benötige.
Aber der Grund des Fehlers ist mir immer noch nicht so ganz klar. Schließlich gibts es ihn ja nur bei einem der beiden Events...
Also kann doch das hier in diesem fall nicht zutreffen: (oder???)

[by SirThornberry]
Zitat:
//Wenn OnChange zugewiesen ist
if Assigned(OnChange) then
OnChange(Self); //OnChange aufrufen
Self.DoAnything; //Wenn jetzt die Componente im OnChange freigegeben wurde knallts weil Self ja nicht mehr auf was gültiges zeigt sondern frei gegeben wurde
Und hierbei

[by Christian Seehase]
Zitat:
Wenn Du das Free ausführst, wird der Speicher, den die Komponente belegt hat, zur erneuten Verwendung freigegeben.
Je nach Konstellation kann es dabei auch vorkommen, das die Komponente dennoch so vollständig erhalten bleibt, das spätere Zugriffe darauf noch einwandfrei funktionieren, es kann aber auch sein, dass entscheidende Bereiche schon wieder überschrieben wurden => AV.
müsste dann bei einem erfolgreichen Freigeben auch das Edit von der Bildfäche verschwinden.. Aber das tut es ja nicht...Es bleibt funktionsfähig da...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Zugriffsverletzung bei free?

  Alt 7. Mär 2007, 22:19
Moin Hyperspacer,

Zitat von Hyperspacer:
müsste dann bei einem erfolgreichen Freigeben auch das Edit von der Bildfäche verschwinden.. Aber das tut es ja nicht...Es bleibt funktionsfähig da...
Du hast geschrieben, dass es beim ersten mal eine AV gibt, beim zweitem mal nicht.
Davon, dass das Edit danach immer noch funktionsfähig ist war bislang nicht die Rede.

So unmittelbar erklären, könnte ich das nicht.
Wenn Du mir mal den kompletten Code mit dem sich das reproduzieren lässt zur Verfügung stellen kannst, könnte ich mal versuchen dem mit Hilfe der Debug-DCUs auf den Grund zu gehen. Die dürften bei Deiner Personal nicht dabei sein.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Zugriffsverletzung bei free?

  Alt 8. Mär 2007, 19:35
Die sichtbaren Auswirkungen könnten "Zufall" sein!
Ich habe das Beispiel aus dem ersten Posting hier nachvollzogen. Das Edit wird bei mir mit einem Button-Click erzeugt.
Ich bekomme immer eine Exception, egal beim wievielten erzeugenten Edit ich Enter drücke. Das Edit bleibt bei mir nie sichtbar, das Programm schmiert immer ab.

Vermutung:
Die OnExit Methode funktioniert nur ohne Fehler, weil sie in der ganzen Kette der OnExit-Ereignisbehandlung als letztes abgearbeitet wird und nicht zum Edit zurückkehren muss. Ich habe das jetzt nicht step-for-step nachvollzogen, aber ganz viel anders kann es (zumindest sinngemäß) nicht sein.

Die OnKeyDown-Methode muss aber zum Edit zurückkehren, das es aber nach dem Free nicht mehr gibt --> Folge: Crash.

Eigentlich ist es aber auch wurscht, wieso und weshalb ...

Es ist und bleibt der alte Grundsatz: Objekte nie in einer eigenen Ereignisbehandlungsmethode freigeben!

Grundsatz beachten und glücklich sein.

((Irgendwo steht hier oder im DF aber auch eine Umgehung, mit der man eine "Quasi-Selbstzerstörung" vornehmen kann.))
  Mit Zitat antworten Zitat
Hyperspacer

Registriert seit: 23. Apr 2006
53 Beiträge
 
Delphi 7 Personal
 
#16

Re: Zugriffsverletzung bei free?

  Alt 8. Mär 2007, 20:53
Nabend,

Zitat von Christian Seehase:
Wenn Du mir mal den kompletten Code mit dem sich das reproduzieren lässt zur Verfügung stellen kannst, könnte ich mal versuchen dem mit Hilfe der Debug-DCUs auf den Grund zu gehen.
Danke für deine Unterstüzung , aber so extrem wichtig ist es ja nicht --> Hab das Problem ja nun umgangen.

Zitat von IngoD7:
Es ist und bleibt der alte Grundsatz: Objekte nie in einer eigenen Ereignisbehandlungsmethode freigeben!

Grundsatz beachten und glücklich sein. Cyclops
Ich werds ab nun beachten..und glücklich sein

Nochmal danke an alle, die sich mit dem Problem befasst haben.

mfg Daniel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:30 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