4

インターネットの情報によると、次の 2 つの変数がメモリ内の同じ場所を指していることがわかりました。

実際にそれが真であることを示すコード例を誰か提案できますか?

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: String;
begin
  a := 'Test';
  b := a;

  showmessage (a);
  showmessage (b);
end;
4

5 に答える 5

8
procedure TForm4.FormCreate(Sender: TObject);
var
  a, b: string;
begin
  a := 'Test';
  b := a;
  ShowMessage(BoolToStr(pointer(a) = pointer(b), true));
end;

結果はTrueですので、はい、同じデータab指しています。

ただし、

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;

も表示しますFalseab異なる文字列 (ポインタ) 変数であるため、メモリ内のある場所 ( @a) は のデータのアドレスであり、a他の場所 ( @b) は のデータのアドレスですb。最初の例は、メモリ内のこれら 2 つの場所に同じアドレスが含まれていることを示していaます。つまりb、同じデータが含まれています。

于 2011-03-16T15:14:55.503 に答える
3

通常、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;
于 2011-03-16T15:47:51.407 に答える
1
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;
于 2011-03-16T15:36:31.517 に答える
0

あなたの質問は私にはあまり明確ではありません。もしあなたがそうするなら :

begin 
  a := 'Test';
  b := a;
  a := a+'HH';
  showmessage (a);
  showmessage (b); 
end;

見てくれると思いますが…

于 2011-03-16T15:17:07.540 に答える
0

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;
于 2011-03-16T18:07:31.730 に答える