Zur Speicherverwaltung: Ah ja, hatte übersehen, dass du ja mit records arbeitest
Zitat von
himitsu:
und im Prinzip geht auch sowas:
Delphi-Quellcode:
if TDynamicCharSet(['#', '$']).Contains('a') then
beep;
if TDynamicCharSet('#$a..z梣儿梈棅棋㌇').Contains('a') then
beep;
Hm, ja leider eben nicht...
Delphi 2010. Neues
VCL-Projekt. TButton hinzugefügt. OnClick:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
TDynamicCharSet(['#', '$']).Contains('$');
end;
Start. Button drücken. Freuen:
Code:
Im Projekt Project1.exe ist eine
Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00418441 in Modul 'Project1.exe'. Lesen von Adresse 0574C08C' aufgetreten.
Stack-Trace:
DynSet.TDynamicCharSet.Fill('#$', nil)
DynSet.TDynamicCharSet.Fill(['#'..'$'], nil)
DynSet.TDynamicCharSet.&op_Explicit(['#'..'$'])
Unit1.TForm1.Button1Click(???)
Bis
TDynamicCharSet.Fill(Const S: RawByteString; Encoding: TEncoding = nil) geht also alles gut.
Dort wird dann CheckEncode(nil) aufgerufen, wobei Encoding auf _Encoding gesetzt wird, was hier merkwürdigerweise nicht genullt ist, sondern zufällige Werte beinhaltet: (FIsSingleByte:True; FMaxCharSize:1589654467)
Die nächste Zeile (229) crasht dann erwartungsgemäß.
Scheinbar wird bei diesem expliziten Cast das Record nicht mit Nullen gefüllt
Edit: grade nochmal im Debugger überprüft: Beim Aufruf von &op_Explicit ist Result._Encoding schon direkt zu Beginn nicht nil, sondern mit (FIsSingleByte:True; FMaxCharSize:1589654467) gefüllt...
Könnte das noch jemand unter Delphi 2010 testen und bestätigen bitte?