|
毎度お世話になっております。
さて、マクロ変数用のメモリ領域について少し分からないことがあります。call 文で呼び出す
サブルーチンの中の、
$$string
##numeric
とかのローカル変数や、
##1
$$2
とかの引数に割り当てられたメモリ領域は、サブルーチンを return ; で終了させたら速やかに
解放されるのでしょうか ?
変数用メモリ領域の上限が最大で 64MB と手狭な中で、もしローカル変数と引数に割り当てられた
メモリがマクロ全体の終了まで居座り続ければ、大量のサブルーチンの使用の際にメモリリークが
発生してしまい、メインのグローバル変数の容量がどんなに少なくても変数用メモリが枯渇して
しまいます。
例えば、文末に掲示したような極端なケースの場合、もしメモリリークがあればあっという間に
メモリ不足のエラーとなってしまいます。
現実には、1 つのマクロにサブルーチンを万単位で作ることはまずありません。しかし実際の運用では、
同じシグネチャで中身の異なるサブルーチンの「配列」を数十 〜 数百個単位で用意して、その
サブルーチンの名前文字列値を「関数ポインター」のように扱って状況に応じて呼び出すサブルーチンを
切り替える、ということはよくあります。
今のところ、万単位でサブルーチンを書く作業が大変なため、当方でテストはまだ行っていません。
また、当方で実際に使用しているマクロでもメモリ不足のエラーにはまだ出くわしていません。
しかし、サブルーチンの終了でのメモリ開放が正しく実装されているのか、それともメモリリークが
本当に存在しているのか当方で把握し切れていないため、今後マクロに新しいサブルーチンを追加しただけで
メモリ不足のエラーが起きないかどうか不安なところでございます。
ローカル変数と引数のメモリ管理に関する詳細な説明を、どうかよろしくお願い申し上げます。
debuginfo 2 ;
#index = 0 ;
while ( #index < 65536 ) {
$delegate = @"Function_" + str( #index ) ;
call $delegate
#index
, @"寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末食う寝る処に住む処"
+ @"藪ら柑子の藪柑子パイポパイポパイポのシューリンガンシューリンガンのグーリンダイ"
+ @"グーリンダイのポンポコピーのポンポコナの長久命の長助"
;
#index = #index + 1 ;
}
endmacro ;
Function_0
$$value = str( ##1 ) + @" : " + $$2 ;
debuginfo $$value + "\U0000000A" ;
return $$value ;
Function_1
$$value = str( ##1 ) + @" : " + $$2 ;
debuginfo $$value + "\U0000000A" ;
return $$value ;
Function_2
$$value = str( ##1 ) + @" : " + $$2 ;
debuginfo $$value + "\U0000000A" ;
return $$value ;
// .... 以下繰り返し。....
Function_65534
$$value = str( ##1 ) + @" : " + $$2 ;
debuginfo $$value + "\U0000000A" ;
return $$value ;
Function_65535
$$value = str( ##1 ) + @" : " + $$2 ;
debuginfo $$value + "\U0000000A" ;
return $$value ;
|
|