AGB  ·  Datenschutz  ·  Impressum  







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

Kann "Clear" Fehler auslösen?

Ein Thema von Pseudemys Nelsoni · begonnen am 29. Jul 2005 · letzter Beitrag vom 29. Jul 2005
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

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

Kann "Clear" Fehler auslösen?

  Alt 29. Jul 2005, 10:41
Moin,

folgendes:

Delphi-Quellcode:
destructor TChannels.Destroy;
begin
  //FChannelList.Clear;
  inherited;
end;
Wenn ich hier "FChannelList.Clear;" nicht auskommentiere, dann bekomme ich beim Beenden meines Programms eine AV, wenn ich selbiges aber tue, funktioniert alles. Wie kann das sein? In welchem Fall kann Clear eine AV auslösen? FChannelList ist vom Typ "TObjectList". (Objekt ist kreiert!)
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Kann "Clear" Fehler auslösen?

  Alt 29. Jul 2005, 10:45
Wiord eventuell nach dem Zerstören von TChannesl noch auf Items der Liste zugegriffen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#3

Re: Kann "Clear" Fehler auslösen?

  Alt 29. Jul 2005, 10:47
Schwer zu sagen mit vier Zeilen Code.
Was mir als erstes einfällt:
Die Objektliste enthält mindestens 1 Objekt, welches bereits freigegeben wurde. Da die Objektliste bei einem "Clear" standardmäßig alle enthaltenen Objekte freigibt würde das die AV erklären.

Was mir noch einfällt:
Ist das Feld "FChannelList" in "Create" von "TChannels" erzeugt worden? Wenn ja solltest du in Destruktor nicht "FChannelList.Clear" sondern "FChannelList.Free" aufrufen.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

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

Re: Kann "Clear" Fehler auslösen?

  Alt 29. Jul 2005, 10:52
Moin Luckie,

theoretisch müsste es ja so sein, sonst könnte ja kein Fehler kommen, aber dem ist nicht so, beim Beenden passiert nichtsmehr.
Das komische ist auch, das ich mich entscheiden kann, was ich auskommentieren möchte um keine av zu bekommen und zwar entweder:

Delphi-Quellcode:
destructor TChannels.Destroy;
begin
  //FChannelList.Clear;
  inherited;
end;
oder innerhalb im OnRead eines ClientSockets:

Delphi-Quellcode:
      if Command = 'JOINthen
      begin
        if CompareText(FNickname, User.FNickname) = 0 then
        begin
          //Channel := FChannels.NewChannel(Param(Params, 0));
          //if Assigned(FOnJoined) then
          // FOnJoined(Self, Channel);
        end else

NewChannel sieht dabei so aus:

Delphi-Quellcode:
function TChannels.NewChannel(const Channel: string): TChannel;
begin
  Result := TChannel.Create;
  Result.FName := Channel;
  Result.FTopic := '';
  Result.FKey := '';
  Result.FLimit := 0;
  Result.FUserCount := 0;
  FChannelList.Add(Result);
end;
Daher wundert mich das, wenn ich eines der beiden Teile auskommentiere, gibts keine Fehler, sonst AV.
Und ich seh nicht was daran falsch sein könnte.

EDIT:

@KrasserChecker:

Eine Objektliste kann nil Objekte enthalten, der aufruf von Clear führt dabei aber nicht zu einer AV, da sie das ganz gut handlen kann bzw prüft ob ein Objekt bereits nil ist, oder nicht.

Edit4:

Zitat:
Was mir noch einfällt:
Ist das Feld "FChannelList" in "Create" von "TChannels" erzeugt worden? Wenn ja solltest du in Destruktor nicht "FChannelList.Clear" sondern "FChannelList.Free" aufrufen.
Jo, das stimmt, aber ich möchte in anderen Prozeduren später auch noch "Clear" aufrufen können, also muss das mit Clear auch irgendwie funktionieren oder?

Edit5:

Gerade getestet mit .Free - das löst auch einen Fehler aus. Ich glaube nicht das die Fehler an meinen auskommentierten Zeilen liegt. Wie ich sowas liebe, nun weiss ich nicht wo ich nach Fehlern suchen soll.
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Kann "Clear" Fehler auslösen?

  Alt 29. Jul 2005, 11:05
Zitat von Pseudemys Nelsoni:
Eine Objektliste kann nil Objekte enthalten, der aufruf von Clear führt dabei aber nicht zu einer AV, da sie das ganz gut handlen kann bzw prüft ob ein Objekt breits nil ist, oder nicht.
Hi! Wie gibst du die TChannel Objekte frei? Hast du beim Erstellen der TObjectList den Parameter OwnsObjects auf true oder false gesetzt?

Wie KrasserChecker gesagt hat könnte es sein, dass du an anderer Stelle bereits einen TChannel mit Free() freigibst. Dadurch wird die Referenz in der TObjectList zwar ungültig, aber nicht nil. TObjectList.Clear() bzw. TObjectList.Free() würde bei OwnsObjects = true dann versuchen, das TChannel Objekt nochmal freizugeben ==> AV.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#6

Re: Kann "Clear" Fehler auslösen?

  Alt 29. Jul 2005, 11:10
Zitat:
Jo, das stimmt, aber ich möchte in anderen Prozeduren später auch noch "Clear" aufrufen können, also muss das mit Clear auch irgendwie funktionieren oder?
Gehört das Feld "FChannelList" in "TChannels"? Wird es im Create erzeugt? Wenn ja solltest Du die Liste auch im .Free wieder freigeben. Ansonsten könnte es passieren, dass Du dir da ein Speicherleck einhandelst.

BTW: Warum willst Du auf die Liste zugreifen, nachdem Du das "TChannels"-Objekt freigegeben hast?
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

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

Re: Kann "Clear" Fehler auslösen?

  Alt 29. Jul 2005, 11:14
Moin Dani,

ich setze den OwnsObjects-Parameter nicht, daher ist er automatisch true.
Wenn ich mein Programm starte, wird folgendes getan:

Delphi-Quellcode:
constructor TChannels.Create;
begin
  inherited;
  FChannelList := TObjectList.Create;
end;
Dann wenn ich mit dem Server verbunden bin und einen Channel betreten hab:

Delphi-Quellcode:
      if Command = 'JOINthen
      begin
        if CompareText(FNickname, User.FNickname) = 0 then //wenn ich joine(dieser teil wird ausgeführt)
        begin
          Channel := FChannels.NewChannel(Param(Params, 0));
          if Assigned(FOnJoined) then
            FOnJoined(Self, Channel);
        end else //wenn jemand anderes joint
        begin
          Channel := FChannels.ChannelByName(Param(Params, 0));
          Channel.FUsers.NewUser(User.FNickname);
          if Assigned(FOnJoin) then
            FOnJoin(Self, User, Channel);
        end;
      end else
Dann schliesse ich das Programm per "X"-Button und das wird noch ausgeführt:

Delphi-Quellcode:
destructor TChannels.Destroy;
begin
  FChannelList.Free;
  inherited;
end;
Einen Channel vorher freigeben tu ich nicht



EDIT:

@KrasserChecker

Zitat:
Gehört das Feld "FChannelList" in "TChannels"? Wird es im Create erzeugt? Wenn ja solltest Du die Liste auch im .Free wieder freigeben. Ansonsten könnte es passieren, dass Du dir da ein Speicherleck einhandelst.
Jup, das Feld gehört darein, aber da .Free einen Fehler auslöste, hab ich geguckt ob .Clear auch einen auslöst - dem war ja auch so.

Zitat:
BTW: Warum willst Du auf die Liste zugreifen, nachdem Du das "TChannels"-Objekt freigegeben hast?
Hm, möchte ich eigentlich nicht, wo tu ich das?
Mario
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:07 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