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

FreeBASIC Allocate

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

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

←リンク元に戻る プログラム開発関連に戻る

空いているストレージから、1ブロックのメモリを割り当てます。

構文:
declare function Allocate cdecl ( byval count as uinteger ) as any ptr

用法:
result = Allocate( count )

パラメタ:
count
割り当てるメモリのブロックの、サイズ。バイトで表現される。

戻り値:
うまくいくと、割り当てられたメモリの開始アドレスを、返します。
それ以外、要求されたブロック・サイズを割り当てられないか、count < 0 であれば、ヌルポインタ (0) を返します。

記述:
フリー ストア (塊(heap)) からバイトの count 数を割り当てまたは予約します。
新しく割り当てられたメモリは初期化されません。

新しく割り当てられたメモリの初期値が指定されていないので、AllocateString または UDT を含む文字列で、直接使わないでください。文字列記述子がクリアされず(ランダムデータを含む)、破損した文字列などを引き起こす(メモリ内のランダムな場所に書き込もうとするか、ランダムポインタを解放しようとする)可能性があるためです。

String や、String を含む UDT で必要なことは、Callocate (メモリの消去)を使う、あるいは UDT では New Expression (構築子を呼び出す)を使う、また最悪でも、Allocate の後で、最初の文字列を使う前に記述子(0に設定)を明示的に消去することです。
ZstringWstring のメモリの割り当てについては、対応するページを参照ください。

返されるポインタは、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

 参考:以下は、フィボナッチ数だけでプログラム言語に精通したつもりになる
で紹介していただいている、再帰関数を用いたサンプルを微修正したものです。
'フィボナッチ数 by FreeBasic

Declare Function Fib(N As Integer) As Integer

Dim N As Integer
Dim Start As Double

Print  "番目 フィボナッチ数  秒"
   
For N=1 To 39
   Start = Timer
   Print Using "###  ###,###,###  ##.####"; N; Fib(N); Timer - Start
Next N

Print  "番目 フィボナッチ数  秒"
Sleep

Function Fib(N As Integer) As Integer
   If N < 2 Then
      Fib = N
   Else
      Fib = Fib(N - 2) + Fib(N - 1)
   End If
End Function

 

割り当てたメモリを、これ以上使わない場合に、メモリを解放することは、重要です。
未使用メモリーは、解放しないと、単にメモリを浪費しているだけです。
そのメモリのアドレスが、なにか上書きされるか、忘れられていると、そのメモリは決して解放できません。
この状態は、「メモリ・リーク」として知られていて、どんなことをしても避けるべきです。
「通常の」終了でも、異常終了でも、アプリケーションが終了するときは、漏らされたメモリは、常に完全に解放されます。
このため、「メモリ・リーク」の状態は、アプリケーションが動作しているあいだだけです。
それでも、アプリケーションの中で、割り当てられたどんなメモリでも、解放するように注意することは、良い習慣です。
以下の例は、メモリ・リークの関数を示しています。ここでは、割り当てられたメモリのアドレスが無くなって、これ以上解放できません。
このような関数が頻繁に呼ばれると、浪費されたメモリの総量は、急速に蓄積されます。

'' メモリ・リークを引き起こす Allocate 用法の悪例

Sub BadAllocateExample()

    Dim p As Byte Ptr

    p = Allocate(420)   '' 新しい記憶域に、ポインタを割り当てます。

    p = Allocate(420)   '' 同じポインタを、別の記憶域に、再振当てします。
                        '' 旧いアドレスは無くなり、そのメモリは漏らされます。

    Deallocate(p)

End Sub

    '' メイン
    BadAllocateExample() '' メモリ・リークを作成します
    Print "メモリ・リーク!"
    BadAllocateExample() '' ... そして、別の
    Print "メモリ・リーク!"
    End


プラットホーム差:

方言差:

QBからの違い:

参照:
メモリ関数に戻る

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2022-04-29 02:20:29
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

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

表示-非営利-継承