フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: PCharにキャストした時のポインタの生存期間
au
メンバー
投稿数: 16
PCharにキャストした時のポインタの生存期間
on: 2013/05/15 10:14 Wed

MLであった話題ですが。文字列をPCharにキャストした場合のポインタの生存期間の話。

ヘルプ 文字列型(Delphi)のページ内[Delphi 文字列と NULL 終端文字列の混在]の中に記述があります。
http://docwiki.embarcadero.com/RADStudio/XE3/ja/%E6%96%87%E5%AD%97%E5%88%97%E5%9E%8B

「UnicodeString 型または AnsiString 型の変数をポインタにキャストする場合は、その変数が新しい値を代入されるかスコープから外れるまで、そのポインタは有効です。他の任意の文字列式をポインタにキャストする場合、そのポインタは、型キャストが実行されるステートメント内でのみ有効です。」

変数に格納されてる文字列をキャストする場合は、その変数の生存期間又は、キャストしてから元の変数の文字列が変更されるまでが生存期間という事になります。

変数に格納されてない文字列の場合は、その文(ステートメント)の間でのみ有効って事ですね。


procedure test;
var
S: String;
P: PChar;
begin
S := 'TEST';

P := PChar(S);
Hoge(P); // OK
S := S + '1'; // 以降Pは保証なし
Hoge(P);

Hoge(PChar('TEST')); // OK
P := PChar('TEST');
Hoge(P); // 保証なし
end;
Mr.XRAY
メンバー
投稿数: 192
Re: PCharにキャストした時のポインタの生存期間
on: 2013/05/15 11:53 Wed

au さんまとめてくださったんですね.サンクスです.分かりやすいです.
Delphi ML の投稿は見たのですが,私のメーラーは引用部分が表示されて読み難いのです.
助かります.

>変数に格納されてない文字列の場合は、その文(ステートメント)の間でのみ有効って事ですね。

結構こういうことやっています.要注意ですね.

DEKO
管理者
投稿数: 2693
Re: PCharにキャストした時のポインタの生存期間
on: 2013/05/15 12:23 Wed

ちょっとだけ関連しますが、
変数に格納された文字列であっても、例えば CreateProcess() に渡す場合にはそのままではダメな場合があります。

[Delphi Unicodeワールド パートIII: コードをUnicode対応にする ]
http://edn.embarcadero.com/jp/article/38699

[Createprocess (MSDN)]
http://msdn.microsoft.com/ja-jp/library/cc429066.aspx

このパラメータで const 文字列(リテラル;文字列定数)を指定すると、この関数の Unicode 版である CreateProcessW 関数は失敗します。

 
解決方法が消えていますが、以前は UniqueString() を使う方法が提示されていました。UniqueString() では解決しないんでしょうかね?
元から書かれていないようですね。私は Stack Overflow の記事を読んだんでしたっけ…?

[Access Violation in function CreateProcess in Delphi 2009 (Stack Overflow)]
http://stackoverflow.com/questions/6705532/access-violation-in-function-createprocess-in-delphi-2009

See Also:
[UniqueString (DeocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/System.UniqueString

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.032 sec.