既存の予約済みメモリ・ブロックの格納を、再割り当てします。
構文:
用法:
result = Reallocate( pointer, count )
パラメタ:
pointer
再割当てされる、割り当てられたメモリのアドレス。
count
再割当てされる、バイト数の合計。
戻り値:
再割当てされたメモリの、アドレス。
再割当てが失敗すると、ヌル (0) ポインタを返します。このとき、pointer によって示されたオリジナルのメモリは、変更されません。
記述:
先に
Allocate か
Callocate で割り当てられたメモリを再割り当てします。
バッファの内容は保持されますが、
count がメモリ ブロックの元のサイズよりも小さい場合、バッファは切り捨てられます。
サイズを大きくした場合、追加されたメモリ範囲は何も初期化されません。
再割り当てでは、最初に、保持されるデータの再コピーを避けるために、開始アドレスを移動せずに既に割り当てられているメモリのサイズを変更しようとします (返されるポインター値は変更されません)。
これが不可能な場合は、古いメモリ領域の割り当てを解除する前に、新しい別のメモリ領域が割り当てられ、保持されるデータの再コピーが行われます (返されたポインタ値が変更されます)。
Reallocate を使うとき、メモリーリークの可能性を防ぐために、result ポインターを保存しなければなりません。オリジナルの pointer は、再配分の後、無効になるかもしれないからです。
新しいポインターの値を確認する必要があります。これが 0 なら、再割当ては失敗しました。オリジナルの pointer は、有効なままです。また、それに割り当てられたメモリの量は変わっていません。
再割当てされたメモリが、必要なくなった場合は、再割当てされたメモリは、
Deallocate で解放しなければなりません。
pointer がヌル (
0) なら、
ReAllocate は、
Allocate 同様に動作します。
pointer が有効で、
count がヌル(0)ならば、
ReAllocate は、
Deallocate と同様に動作します。そして、ヌル(0)ポインターが返されます。
メモリが、前もって、
Deallocate か
ReAllocate の呼び出しによって割当てを取り消されたならば、ふるまいは未定義です。
手で、メモリを
String 記述(または、それを含む
UDT)に割り当てるとき、
count が記憶ブロックの最初の寸法より大きいなら、最初に文字列を使う前に、新しい増設メモリ範囲を、ゼロに、明示的に消去しなければなりません。(たとえば、
Clear を使う。)
そうしないと、文字列にアクセスすると、未定義結果を引き起こします。(メモリのランダムな場所で、書いたり読もうとしたり、あるいは、ランダムなポインターを割当て解除しようとします。)
注意:
pointer がオブジェクトのインスタンス自体を指している場合、ひどいクラッシュを引き起こす可能性があるため、メンバー手続き内で
Reallocate (再割り当て)を使うことはできません:
-
Reallocate (オブジェクト データがメモリに移動)によって pointer が変更された場合、渡された This 参照は、宙ぶらりんの ポインタと同じように不整合になります。
-
この場合、このメンバー手続きから非静的メンバー フィールドへの後続のアクセスはすべてエラーになります。ただし、このメンバー手続きの本体で Reallocate を実行した直後に、渡された This 参照が (@This = new pointer value によって) 再調整される場合を除きます。
例:
Dim a As Integer Ptr, b As Integer Ptr, i As Integer
a = Allocate( 5 * SizeOf(Integer) ) ' 5つの整数のために、メモリを割り当てます。
If a = 0 Then Print "Error Allocating a": End
For i = 0 To 4
a[i] = (i + 1) * 2 ' 整数をバッファに割り当てます。
Next i
b = Reallocate( a, 10 * SizeOf(Integer) ) ' 5 つの追加整数のために、メモリを再割当てする
If b <> 0 Then
a = b ' 古いポインターを捨てて、新しいものを使います
For i = 5 To 9
a[i] = (i + 1) * 2 ' もっとたくさんの整数をバッファに割り当てます。
Next i
For i = 0 To 9 ' この整数を表示します。
Print i, a[i]
Next i
Print
Else '' Reallocate は失敗して、メモリは変わっていません。
Print "Error Reallocating a"
For i = 0 To 4 ' 整数を表示
Print i, a[i]
Next i
Print
End If
Deallocate a ' 浄化
Sleep
方言差:
- -lang qb 方言では、別名 __Reallocate と共に参照をつけないと、利用できません。
QBからの違い:
参照: