先に割り当てられた記憶域を、解放します。
構文:
用法:
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 マクロは、オリジナルのポインタが、関数が呼ばれた後で、実際にヌルであるかどうか、テストするのに使われます。
この例は、ポインタが示すメモリを割当解除する関数に、ポインタを渡す正しい方法が、参照渡しであることを、示唆しています。
方言差:
-
-lang qb 方言では、別名 __Deallocate と共に参照をつけないと、利用できません。
QBからの違い:
参照: