文字列へのポインタがどのように機能するかを理解しようとしています。私は誰かによって書かれたコード (正確にはオリジナルではない) を持っています。
var
STR: string;
pStr: ^string;
begin
STR := 'Hello world';
New(pStr);
pStr^ := STR;
PostMessage(Handle, WM_USER+1, wParam(pStr), 0);
end;
メッセージハンドラーがメッセージを取得し、ポインターに文字列が含まれていることは確かです。これは操作できますが、これらの操作の「内部」では何が起こりますか?
小さなプロジェクトを作ってみました。文字列を str ポインタが指すものに割り当てると、実際には元の文字列のrefcountが増加し、文字列のコピーは作成されないと思いましたが、refcountは1のままで、内容をコピーしたようです。
それで、何が起こったのですか?ポインターを呼び出すNew
と、空の文字列が割り当てられますよね? 割り当て後、ポインターが指す文字列の refcount/length をこのように調べようとしましたPChar(@pStr^[1])[-8]
が、ナンセンス (14) が返され、長さバイトも間違っていました。
さらに、質問は、Windowsメッセージングを介して文字列を渡すような方法でポインターを使用しても安全ですか?