|
毎度お世話になっております。
さて、マクロ変数用のメモリ領域について少し分からないことがあります。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 ;
|
|