空いているストレージから、1ブロックのメモリを割り当てます。
構文:
用法:
result = Allocate( count )
パラメタ:
count
割り当てるメモリのブロックの、サイズ。バイトで表現される。
戻り値:
うまくいくと、割り当てられたメモリの開始アドレスを、返します。
それ以外、要求されたブロック・サイズを割り当てられないか、count < 0 であれば、ヌルポインタ (0) を返します。
記述:
フリー ストア (塊(heap)) からバイトの count 数を割り当てまたは予約します。
新しく割り当てられたメモリは初期化されません。
新しく割り当てられたメモリの初期値が指定されていないので、
Allocate を
String または
UDT を含む文字列で、直接使わないでください。文字列記述子がクリアされず(ランダムデータを含む)、破損した文字列などを引き起こす(メモリ内のランダムな場所に書き込もうとするか、ランダムポインタを解放しようとする)可能性があるためです。
String や、String を含む UDT で必要なことは、
Callocate (メモリの消去)を使う、あるいは
UDT では
New Expression (構築子を呼び出す)を使う、また最悪でも、
Allocate の後で、最初の文字列を使う前に記述子(0に設定)を明示的に消去することです。
Zstring や
Wstring のメモリの割り当てについては、対応するページを参照ください。
返されるポインタは、
any ptr です。そして、割り当てられたメモリの始まりを示します。
このポインタは、
count がゼロであっても、固有になるように保証されます。
確保したメモリは、必要なくなったら、
Deallocate を使って、割り当てを解除するか、自由なストレージに戻さなければなりません。
例:
'' このプログラムは、ALLOCATE(…) 関数を使って、15の整数のバッファを作成します。
'' そして、フィボナッチ数列の、最初の15番までで満たします。
'' その後、画面に出力します。
'' プログラムの最後で、DEALLOCATE(…) の呼び出しに、注意してください。
Const integerCount As Integer = 15
'' 多くの整数のために、メモリを割り当てます。
''
Dim buffer As Integer Ptr
buffer = Allocate(integerCount * SizeOf(Integer))
If (0 = buffer) Then
Print "Error: メモリを割り当てられません。終了しています。"
End -1
End If
'' メモリを用意して、fibonacci数列で満たします。
''
buffer[0] = 0
buffer[1] = 1
For i As Integer = 2 To integerCount - 1
buffer[i] = buffer[i - 1] + buffer[i - 2]
Next
'' 数列を表示します。
''
For i As Integer = 0 To integerCount - 1
Print buffer[i] ;
Next
Deallocate(buffer)
End 0
出力は以下の通りです。
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
参考:以下は、
フィボナッチ数だけでプログラム言語に精通したつもりになる
で紹介していただいている、再帰関数を用いたサンプルを微修正したものです。
割り当てたメモリを、これ以上使わない場合に、メモリを解放することは、重要です。
未使用メモリーは、解放しないと、単にメモリを浪費しているだけです。
そのメモリのアドレスが、なにか上書きされるか、忘れられていると、そのメモリは決して解放できません。
この状態は、「メモリ・リーク」として知られていて、どんなことをしても避けるべきです。
「通常の」終了でも、異常終了でも、アプリケーションが終了するときは、漏らされたメモリは、常に完全に解放されます。
このため、「メモリ・リーク」の状態は、アプリケーションが動作しているあいだだけです。
それでも、アプリケーションの中で、割り当てられたどんなメモリでも、解放するように注意することは、良い習慣です。
以下の例は、メモリ・リークの関数を示しています。ここでは、割り当てられたメモリのアドレスが無くなって、これ以上解放できません。
このような関数が頻繁に呼ばれると、浪費されたメモリの総量は、急速に蓄積されます。
'' メモリ・リークを引き起こす Allocate 用法の悪例
Sub BadAllocateExample()
Dim p As Byte Ptr
p = Allocate(420) '' 新しい記憶域に、ポインタを割り当てます。
p = Allocate(420) '' 同じポインタを、別の記憶域に、再振当てします。
'' 旧いアドレスは無くなり、そのメモリは漏らされます。
Deallocate(p)
End Sub
'' メイン
BadAllocateExample() '' メモリ・リークを作成します
Print "メモリ・リーク!"
BadAllocateExample() '' ... そして、別の
Print "メモリ・リーク!"
End
プラットホーム差:
この手続きは、スレッド・セーフになるように保証されません。
(複数のスレッドから同時に呼び出すと、問題を起こす場合があります。)
方言差:
- -lang qb 方言では、別名 __Allocate と共に参照をつけないと、利用できません。
QBからの違い:
参照:
ページ歴史:2022-04-29 02:20:29
日本語翻訳:WATANABE Makoto、原文著作者:SysOp