![]() |
Pointer auf Record - Strings problematisch ?
Moin !
Habe da eine Struktur:
Delphi-Quellcode:
Diese Struktur verwende ich bei einem TCP Server um Infos über die Clients abzulegen:
type
PClient = ^TClient; TClient = record PeerIP : string[15]; { Cleint IP address } HostName : String[40]; { Hostname } Connected : TDateTime; { Time of connect } RestString : String; end;
Delphi-Quellcode:
Wenn sich der erste Client connected klappt das ganz gut. Kommt aber ein zweite Client, dann erhalte ich einen Fehler:
procedure TMainFormServer.TCPServerConnect(AContext: TIdContext);
var NewClient: PClient; begin GetMem(NewClient, SizeOf(TClient)); NewClient.PeerIP := AContext.Connection.Socket.Binding.PeerIP; NewClient.Connected := Now; NewClient.RestString := ''; AContext.Data := TObject(NewClient); end; Zitat:
NewClient.RestString := ''; Gibt es da generelle Probleme wenn ich in dem Record Strings ohne Längenangabe verwende? Wird nicht für jeden String auch die Länge mitgespeichert? Dann sollte das doch kein Problem sein !? |
Re: Pointer auf Record - Strings problematisch ?
Zitat:
|
Re: Pointer auf Record - Strings problematisch ?
Ah ok. Danke fpr die Info !
Wie kann ich denn dann einen String unbekannter Länge dort ablegen? |
Re: Pointer auf Record - Strings problematisch ?
Versuch mal statt "GetMem" "New" zu benutzen
Delphi-Quellcode:
procedure TMainFormServer.TCPServerConnect(AContext: TIdContext);
var NewClient: PClient; begin New(NewClient); // <----- NewClient.PeerIP := AContext.Connection.Socket.Binding.PeerIP; NewClient.Connected := Now; NewClient.RestString := ''; AContext.Data := TObject(NewClient); end; |
Re: Pointer auf Record - Strings problematisch ?
Ja das sieht besser aus.
Aber was ist nun der Unterschied? |
Re: Pointer auf Record - Strings problematisch ?
New entspricht
Delphi-Quellcode:
Grund:
GetMem(NewClient, SizeOf(TClient));
Initialize(NewClient {, TClient}); // Strings, dynamische Arrays und Intefaces initialisieren // bzw. GetMem(NewClient, SizeOf(TClient)); ZeroMemory(NewClient, SizeOf(TClient)); der String ist ein initialisierungspflichtiger Typ, da dessen Speicher von Delphi verwaltet wird und ein "Leerstring" nunmal NIL ist. ist der String jetzt nicht NIL und di versuchst diesem einen neuen Wert zuzuweisen, dann versucht Delphi den alten angeblich darin gespeicherten String freizugeben und dann knallt es natürlich. [add] PS: Dispose ist dann natürlich
Delphi-Quellcode:
Finalize(NewClient {, TClient}); // Strings, dynamische Arrays und Intefaces freigeben
FreeMem(NewClient); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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