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

FreeBASIC Deallocate

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

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


先に割り当てられた記憶域を、解放します。

構文:
declare sub Deallocate cdecl ( byval pointer as any ptr )

用法:
Deallocate( pointer )

パラメタ:
pointer
以前に割り当てられたバッファのアドレス。

記述:
この手続きは、以前に Allocate で割り当てられたメモリを、解放します。
pointer は、有効なポインタでなければなりません。
手続きが戻った後に、pointer は無効にされます(無効のメモリアドレスを指す)。
そして、このpointer を使う(再び Deallocate を間接参照するか、呼ぶ)と、未定義の動作をもたらします。

文字列記述子を保持するためにメモリが割り当てられた場合、文字列記述子の割り当てを解除する(文字列データによって使用されるメモリの割り当てを解除できる)前に、文字列を常に破棄("" に設定)する必要があります。
そうしないと、後で割り当てを解除できません。 プログラムの継続でメモリ・リークを引き起こす可能性があります。

ヌル・ポインターで Deallocate を呼んでも、何も起こりません。

例:
下の例は、前に割り当てられた記憶域を、どのように解放するかを示しています。
ポインタは、deallocation に従って、ヌルにセットされることに注意してください:

Sub DeallocateExample1()
   Dim As Integer Ptr integerPtr = Allocate( Len( Integer ) )  '' 新しいメモリアドレスに
                                                               '' ポインタを初期化します

   *integerPtr = 420                                     '' ポインタを使用します
   Print *integerPtr

   Deallocate( integerPtr )                              '' メモリをシステムに戻して解放します
   integerPtr = 0                                        '' そして、ポインタをゼロにします
End Sub

   DeallocateExample1()
   End 0
Sleep



この場合、関数が直ちに後で出るので、それは不必要ですが、ポインターを空にセットすることは、身に付けるよい習慣です。
もし関数が、参照によって渡されたポインターから、メモリを解放すれば、例えば、関数呼び出しの中で使われたポインターは、無効にされます。そして、ポインターを再び割り当てるか、それをヌルにセットするかは、呼び出し側の責任です。
例3は、この種類の状況を正しく扱う方法を示しています。そして、次の例は、複数の参照でメモリを deallocate(割当解除)する効果を示しています。

下の例では、異なったポインタは、前に割り当てられた記憶域を解放するのに使用されます:
'' 警告: ことがどのように完了しているべきでないかを示している「不吉な」例

Sub DeallocateExample2()
   Dim As Integer Ptr integerPtr = Allocate( Len( Integer ) ) 
   '' 初期化 ^^^ ポインタを新しい記憶に

   Dim As Integer Ptr anotherIntegerPtr = integerPtr
   '' 初期化 ^^^ 別のポインタを同じメモリに

   *anotherIntegerPtr = 69                     '' 他のポインタを使います
   Print *anotherIntegerPtr

   Deallocate( anotherIntegerPtr )             '' メモリを解放してシステムに戻します
   anotherIntegerPtr = 0                       '' そして他のポインタを 0 に

'' *integerPtr = 420                           '' 未定義の動作;オリジナル
                                               '' ポインタは無効です
End Sub

   DeallocateExample2()
   End 0



deallocation(割当解除)の後で、両方 のポインタが無効にされることに注意してください。
これは、ポインタを使うとき、バグを起こす可能性がある、別の一つの方法を、例示しています。
一般論として、以前割り当てた記憶の、割当てを取り消すのは、現在メモリを指しているポインタが、ただ1つ(1)だけだということを知っている場合だけにしてください。

Function createInteger() As Integer Ptr
   Return Allocate( Len( Integer ) )                     '' 新たにポインタを返す
End Function                                             '' メモリを割り当てる

Sub destroyInteger( ByRef someIntegerPtr As Integer Ptr )
   Deallocate( someIntegerPtr )                          '' メモリを解放してシステムに戻す
   someIntegerPtr = 0                                    '' ヌルのオリジナルのポインタ
End Sub

Sub DeallocateExample3()
   Dim As Integer Ptr integerPtr = createInteger()       '' ポインタを
                                                         '' 新しいメモリアドレスに初期化

   *integerPtr = 420                                     '' ポインタを使う
   Print *integerPtr

   destroyInteger( integerPtr )                          '' ポインタを参照で渡す
   Assert( integerPtr = 0 )                              '' ポインタは現在、ヌルであるべきです
End Sub

   DeallocateExample3()
   End 0



上のプログラムでは、関数の参照ポインタは、ポインタが示すメモリを deallocate(割当解除)した後、ヌルに設定されます。
ASSERT マクロは、オリジナルのポインタが、関数が呼ばれた後で、実際にヌルであるかどうか、テストするのに使われます。
この例は、ポインタが示すメモリを割当解除する関数に、ポインタを渡す正しい方法が、参照渡しであることを、示唆しています。

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

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

表示-非営利-継承