- ベストアンサー
ActivePerl がハングアップ
Perl で、<STDIN>を繰り返し実行するコマンドライン型のプログラムを作りました。 それをWIn98SEの MS-DOSプロンプト で実行していたのですが、どうも、下記の構文がランダムの確率でハングアップしてしまうようです。 $ExecuteResult[$CNum] = undef; このとき、@ExecuteResult は多次元配列になっており、この下にある $ExecuteResult[$CNum]->[]->[] もいっしょにクリアしたいわけです。 で、この命令を5~10回ほど繰り返すと、場合によって「メモリがリードになることはできませんでした」というエラーが出てしまいます。ようするに不正領域へアクセスしてしまっているんでしょうが。 これに関して回避策を知っている方がいらっしゃいましたらご意見をいただきたいと思います。 よろしくお願いします。 なお、もし、プログラムのソースを見ていただけるという親切な方がいらっしゃいましたら、こちらを見ていただければと思います。(そんな人いるのかな? うーん(^_^;) http://www.edit.ne.jp/~deagle/software/se150.lzh (問題の部分は sql-engine.pl の511行目にあります)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ソース拝見いたしました。力作ですね。 なかなか複雑なので今回の件に絞って言えば、Perl自体がその手のエラー で異常終了してしまうのは本来あってはならないことですね。 バージョンが最新版(5.6.1.626)でないのなら更新して試してみては どうでしょう?またエラーメッセージがはっきりわかるのならActiveState のBugTrackerで既知のバグかどうか検索してみる手段もありますね。 $CNumはどうやらカーソルの種類によってインクリメントされるだけのよう ですから、不正な値になるとも思えませんし…。 やはりアプリケーション側での対策としては、冗長ではありますが $ExecuteResult[$CNum] = undef if (defined($ExecuteResult[$CNum])); と変更しておくぐらいでしょうか。また、ActivePerlの配列の扱いに 疑いがある場合、@ExecuteResultをハッシュの%ExecuteResultに置き換えて、 消去する場合は delete($ExecuteResult{$CNum}); とする手もあるかと思います。ざっと見たところ@ExecuteResult全体を シーケンシャルにアクセスしているところはないように思えましたので、 ハッシュ化しても問題ないかと。 なにか参考になりましたら幸いです。
その他の回答 (1)
お久しぶりです、deagle様。 えっとですね、Perlに限ったことではないのですが、 不正アクセス・・・というエラーを回避するには、 素直にundefを代入する前に、存在するかどうかを チェックしてはどうでしょうか? #Windowsプログラムではこうしますね・・・ ではでは☆
お礼
返事が遅れてすいません(^_^; 確実に存在するエリアに対するアクセスしかしてないんです(^_^; 同じ添え字ですでに確保したエリアに対してしかしない動作をしているので。 メモリをたくさん使うので、それでかなとも考えられるんですが……。
お礼
返事が遅れてすいません。 いちおー、Perl 自体は最新です。www.perl.comからソースを落としてきてコンパイルしようかなとも思ったんですが、つい最近システムが飛んで以降、VCをインストールしてないもので(笑) とりあえず、別口からリファレンスは逐一デリファレンスしないとメモリが怪しくなる、という情報をいただいて対処はしてみたんですが、こっちの方も併用して試してみたいと思います。