![]() |
Kann "Clear" Fehler auslösen?
Moin,
folgendes:
Delphi-Quellcode:
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!)
destructor TChannels.Destroy;
begin //FChannelList.Clear; inherited; end; |
Re: Kann "Clear" Fehler auslösen?
Wiord eventuell nach dem Zerstören von TChannesl noch auf Items der Liste zugegriffen?
|
Re: Kann "Clear" Fehler auslösen?
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. |
Re: Kann "Clear" Fehler auslösen?
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:
oder innerhalb im OnRead eines ClientSockets:
destructor TChannels.Destroy;
begin //FChannelList.Clear; inherited; end;
Delphi-Quellcode:
if Command = 'JOIN' then
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:
Daher wundert mich das, wenn ich eines der beiden Teile auskommentiere, gibts keine Fehler, sonst AV.
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; 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:
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. |
Re: Kann "Clear" Fehler auslösen?
Zitat:
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. |
Re: Kann "Clear" Fehler auslösen?
Zitat:
BTW: Warum willst Du auf die Liste zugreifen, nachdem Du das "TChannels"-Objekt freigegeben hast? |
Re: Kann "Clear" Fehler auslösen?
Moin Dani,
ich setze den OwnsObjects-Parameter nicht, daher ist er automatisch true. Wenn ich mein Programm starte, wird folgendes getan:
Delphi-Quellcode:
Dann wenn ich mit dem Server verbunden bin und einen Channel betreten hab:
constructor TChannels.Create;
begin inherited; FChannelList := TObjectList.Create; end;
Delphi-Quellcode:
Dann schliesse ich das Programm per "X"-Button und das wird noch ausgeführt:
if Command = 'JOIN' then
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
Delphi-Quellcode:
Einen Channel vorher freigeben tu ich nicht :(
destructor TChannels.Destroy;
begin FChannelList.Free; inherited; end; EDIT: @KrasserChecker Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz