インターネットの情報によると、次の 2 つの変数がメモリ内の同じ場所を指していることがわかりました。
実際にそれが真であることを示すコード例を誰か提案できますか?
procedure TForm1.Button1Click(Sender: TObject);
var
a, b: String;
begin
a := 'Test';
b := a;
showmessage (a);
showmessage (b);
end;
インターネットの情報によると、次の 2 つの変数がメモリ内の同じ場所を指していることがわかりました。
実際にそれが真であることを示すコード例を誰か提案できますか?
procedure TForm1.Button1Click(Sender: TObject);
var
a, b: String;
begin
a := 'Test';
b := a;
showmessage (a);
showmessage (b);
end;
procedure TForm4.FormCreate(Sender: TObject);
var
a, b: string;
begin
a := 'Test';
b := a;
ShowMessage(BoolToStr(pointer(a) = pointer(b), true));
end;
結果はTrue
ですので、はい、同じデータa
をb
指しています。
ただし、
procedure TForm4.FormCreate(Sender: TObject);
var
a, b: string;
begin
a := 'Test';
b := a;
b := 'Test2';
ShowMessage(BoolToStr(pointer(a) = pointer(b), true));
end;
が表示されFalse
ます。
さらに、次のことに注意してください。
procedure TForm4.FormCreate(Sender: TObject);
var
a, b: string;
begin
a := 'Test';
b := a;
ShowMessage(BoolToStr(@a = @b, true));
end;
も表示しますFalse
。a
とb
は異なる文字列 (ポインタ) 変数であるため、メモリ内のある場所 ( @a
) は のデータのアドレスであり、a
他の場所 ( @b
) は のデータのアドレスですb
。最初の例は、メモリ内のこれら 2 つの場所に同じアドレスが含まれていることを示していa
ます。つまりb
、同じデータが含まれています。
通常、Delphiは文字列に「コピーオンライト」セマンティクスを使用するため、トリックを実行するには一種のハッキングが必要です。たとえば、次のようになります。
procedure TForm13.Button1Click(Sender: TObject);
const
Test: string = '12345';
var
S1, S2: string;
P: PChar;
begin
SetString(S1, PChar(Test), 5);
// we need to copy '12345' string from readonly memory to heap
S2:= S1;
// Now both S1 and S2 points to the same memory
P:= Pointer(S1);
P^:= 'A';
ShowMessage(S2); // 'A2345'
end;
var
a, b: string;
begin
a := 'Test';
a := a + '!'; // added after Rob's comment below,
// makes sure a points to an allocation on the heap
b := a;
PChar(b)[3] := 'T';
ShowMessage(a); //--> TesT!
end;
あなたの質問は私にはあまり明確ではありません。もしあなたがそうするなら :
begin
a := 'Test';
b := a;
a := a+'HH';
showmessage (a);
showmessage (b);
end;
見てくれると思いますが…
OKはこのコードでより明確になるかもしれません
procedure TForm1.FormCreate(Sender: TObject);
var
a, b , s : string;
p : pointer;
begin
a := 'Test';
b := a;
// we see the 2 diff. var pointing on the same adress
s := Format('%p -> %p / %p -> %p', [@pointer(a),pointer(a),@pointer(b),pointer(b)] );
ShowMessage( 'first : '+s);
// we see the 2 diff. var pointing on different adresses
a := 'Test2';
s := Format('%p -> %p / %p -> %p', [@pointer(a),pointer(a),@pointer(b),pointer(b)] );
ShowMessage( 'second : '+s);
end;