FreeBASIC マニュアルのトップに戻る

FreeBASIC Reallocate

目次→実行時ライブラリー参考→メモリ関数REALLOCATE←オリジナル・サイト

REALLOCATE 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


既存の予約済みメモリ・ブロックの格納を、再割り当てします。

構文:
declare function Reallocate cdecl ( byval pointer as any ptr, byval count as uinteger ) as any ptr

用法:
result = Reallocate( pointer, count )

パラメタ:
pointer
再割当てされる、割り当てられたメモリのアドレス。
count
再割当てされる、バイト数の合計。

戻り値:
再割当てされたメモリの、アドレス。
再割当てが失敗すると、ヌル (0) ポインタを返します。このとき、pointer によって示されたオリジナルのメモリは、変更されません。

記述:
先に AllocateCallocate で割り当てられたメモリを再割り当てします。
バッファの内容は保持されますが、count がメモリ ブロックの元のサイズよりも小さい場合、バッファは切り捨てられます。
サイズを大きくした場合、追加されたメモリ範囲は何も初期化されません。

再割り当てでは、最初に、保持されるデータの再コピーを避けるために、開始アドレスを移動せずに既に割り当てられているメモリのサイズを変更しようとします (返されるポインター値は変更されません)。
これが不可能な場合は、古いメモリ領域の割り当てを解除する前に、新しい別のメモリ領域が割り当てられ、保持されるデータの再コピーが行われます (返されたポインタ値が変更されます)。

Reallocate を使うとき、メモリーリークの可能性を防ぐために、result ポインターを保存しなければなりません。オリジナルの pointer は、再配分の後、無効になるかもしれないからです。
新しいポインターの値を確認する必要があります。これが 0 なら、再割当ては失敗しました。オリジナルの pointer は、有効なままです。また、それに割り当てられたメモリの量は変わっていません。

再割当てされたメモリが、必要なくなった場合は、再割当てされたメモリは、Deallocate で解放しなければなりません。

pointer がヌル (0) なら、ReAllocate は、Allocate 同様に動作します。
pointer が有効で、count がヌル(0)ならば、ReAllocate は、Deallocate と同様に動作します。そして、ヌル(0)ポインターが返されます。

メモリが、前もって、DeallocateReAllocate の呼び出しによって割当てを取り消されたならば、ふるまいは未定義です。

手で、メモリを String 記述(または、それを含む UDT)に割り当てるとき、count が記憶ブロックの最初の寸法より大きいなら、最初に文字列を使う前に、新しい増設メモリ範囲を、ゼロに、明示的に消去しなければなりません。(たとえば、Clear を使う。)
そうしないと、文字列にアクセスすると、未定義結果を引き起こします。(メモリのランダムな場所で、書いたり読もうとしたり、あるいは、ランダムなポインターを割当て解除しようとします。)

注意:
目的の関数の中でポインタを再割当てするのは、未定義です。このため、このポインタが、関数の親オブジェクトを含むと、ひどいクラッシュをもたらすでしょう。

例:
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
 


方言差:
QBからの違い:
参照:
メモリ関数に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2022-04-28 12:53:56
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

ホームページのトップに戻る

表示-非営利-継承