|
Delphi Programming / Object Pascal

[掲載 2011年05月12日] [更新 2019年11月26日] Delphi 一般・その他 |
バッファとしてのメモリや文字列(要素数)を確保、割り当てるために使用する関数類です。
Delphi 2009 から Unicode 対応になりましたが、2011年5月12日現在、当サイトのサンプルの文字列バッファの確保のコードには、Delphi 2009 以降では正常動作しないものがあります。必要があればこの表を参考にして修正してください。
この他、項目識別子には特別なメモリ確保と解放の方法があります。
また、関数や手続きではありませんが、変数を array [0..Count -1] of Char という配列型で定義すれば、Count 分の文字領域を確保します。これを Char 型の静的配列と言います。 |
FillChar 手続きは、主に Char 型の静的配列の初期化、つまり、全ての要素の値を Null 文字にするために使用します。初期化のサイズは、変数または型が占めるバイト数を返す SizeOf 関数を使用するのが一般的です。
バッファとして Char 型の静的文字配列を使用するコードを実行する場合、使用していない、あるいは使用しなくなったメモリの値が 0 に初期化されているわけではありません。そのため、バッファとしての文字列に、いわゆる「ゴミ」が入ってしまうことがあります。FillChar 手続きによる初期化を実行するようにした方が確実であることは間違いありません。 |
[備考]
同じバイト値ではなく、同じ「文字」だけの文字列の作成には StringOfChar 関数が使用できます。同じ「文字列」を指定回数繰り返す文字列の作成には DupeString 関数が使用できます。
DupeString 関数を使用するには、uses に System.StrUtils が必要です。 |
確保したメモリは解放処理が必要です。そうしないとメモリリークが発生します。
ただし、SetLength 手続きで確保したメモリ領域は、スコープを抜けると指導的に開放、破棄される仕組みになっています。
メモリを確保したポインタ型の変数には @ 演算子付きの変数やポインタ型の変数を代入しないようにします。そのような代入処理を行うと、データの格納アドレスが変わってしまい、正常な処理が期待できなくなります。その状態では確保したメモリが解放できなくなり「無効なポインタ操作」のエラーが発生します。
PChar 型や String 型の文字列用のメモリを確保した場合も同じですが、メモリを SetLength 手続きで確保した場合は「無効なポインタ操作」のエラーは発生しません。
確保したメモリに文字列を書き込むには、代入ではなく、StrPCopy, StrPLCopy 関数や MoveChars 手続き等を使用します。インデックス (添字) を使用した文字単位の代入ば問題ありません。PChar 型の変数ではポインタの移動やポインタ演算による文字の代入も可能です。
メモリを確保するということは、データの格納場所を、固定したアドレスの領域 (メモリブロック) にすることです。そのアドレスが変わってしまってはメモリ確保の意味がありません。
メモリを解放した後であれば、それらの変数に値を直接代入しても構いません。 |
|