Einzelnen Beitrag anzeigen

AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#1

Stringverwaltung / Ansistring

  Alt 1. Jun 2018, 10:16
Hallo,
ich habe eine Frage zum AnsiString und dessen Verwaltung im Speicher.

Folgendes Konstrukt (ich möchte keine Diskussion über Nutzen/Zweck/Sinnhaftigkeit etc. des QT erzeugen):

Delphi-Quellcode:
//Global
var
  MyAnsi: AnsiString;

procedure TForm1.MakeStr(aStr: PAnsiString; Laenge: Integer);
var
  TmpStr : String[4];
begin
  SetLength(aStr^, 0);
  SetLength(aStr^, Laenge);

  TmpStr := 'HA';
  Move(TmpStr[1], aStr^[1], 2);
end;

procedure TForm1.MakeStr2(aStr: PAnsiString);
var
  NewMsgString : AnsiString;
begin
  NewMsgString := Copy(aStr^, 1, 2) + 'HALLO WELT';

  aStr^ := NewMsgString;
end;

procedure TForm1.MakeStr3(aStr: PAnsiString);
var
  NewMsgString : AnsiString;
begin
  NewMsgString := Copy(aStr^, 1, 2) + 'KURZ';

  aStr^ := NewMsgString;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MakeStr(@MyAnsi, SizeOf(Word));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  MakeStr2(@MyAnsi);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  MakeStr3(@MyAnsi);
end;
Beim Aufruf von MakeStr, wird die Länge des Strings gesetzt auf die Länge, welche im Parameter übergeben wurde.
Anschließend wird etwas in den String geschrieben.

Im Aufruf von MakeStr2 wird das SetLength nicht aufgerufen aber die Länge des Ursprungsstrings vergrößert, da ich noch was hinten dran hänge.

Im Aufruf von MakeStr3 wird das SetLength nicht aufgerufen aber die Länge des Ursprungsstrings verkürzt, da ich am Ende was "abschneide".

Meine Frage ist nun, muss ich das SetLength eigentlich machen bzw. kann mir beim Aufruf von MakeStr2/MakeStr3 etwas im Speicher hängen bleiben?

Ich hoffe ich versteht meine Frage und könnt mir weiterhelfen.
  Mit Zitat antworten Zitat