※ ChatGPTを利用し、要約された質問です(原文:Attempt to free unreferenced scalar とは?)
Attempt to free unreferenced scalarとは?! エラーの原因と解決方法を教えてください
このQ&Aのポイント
CGI開発中に”Attempt to free unreferenced scalar”エラーが発生しました。具体的な要因や解決策を教えてください。
エラーメッセージ「Attempt to free unreferenced scalar: SV 0xXXXXXXX, Perl interpreter: 0xXXXXXX at XXX.cgi line XX.」について、意味が分かりません。解釈や解決策を教えてください。
ローカル環境では正常に動作しているCGIが、本番機で”Attempt to free unreferenced scalar”エラーが発生します。具体的な原因と解決方法を教えてください。
Attempt to free unreferenced scalar とは?
あるCGIを開発しているのですが動作確認してみたところ
Attempt to free unreferenced scalar: SV 0xXXXXXXX, Perl interpreter: 0xXXXXXX at XXX.cgi line XX.
のようなエラーがでるようになりました。
調べてみると
http://perldoc.jp/docs/perl/5.6.1/perldiag.pod
> (W) Perl がスカラの参照カウントをデクリメントしようとして、0 になるかを見たところ、既に 0 になっていることがわかりました。これは、既に解放されているべきものであり、実際は、おそらく、解放されたものでしょう。これは、SvREFCNT_dec() が必要以上に呼ばれたか、SvREFCNT_inc() が必要なときに呼ばれなかったか、SV が消滅すべきで無いときに消滅してしまったか、メモリ異常になったことが考えられます。
と書いてあるのですが意味が分かりません。
どなたか主にこのエラーが発生する具体的な要因や解決方法などを
教えていただけないでしょうか。
なお、ローカルの環境(04WebServer+Active Perl v5.10.0 build 1002)
では正常に動作するのに本番機(IIS+Active Perl v5.8.8 build 817)で
このような現象がでています。
エラーのでている部分のスクリプトは申し訳ありませんが事情で
提示できないのであくまでこういう時に発生するというような情報と
解決策があるだけでよろしいです。
他に必要な情報があれば書いていただいたことはなるべく調べて回答
するようにします(ただし調べきれない場合もあると思います)。
ただ、返事の方が動作確認できない状態になるため1週間後辺りに
なります。
よろしくお願いします。
お礼
あれから調べてみた限りでは http://d.hatena.ne.jp/usuihiro1978/20080107 に関する不具合なのかなと思います。 まだ、根本的に解決できていませんが質問してからずいぶん経って しまったのでいったん締め切って後ほど新たに質問し直そうと思います。 ありがとうございました。
補足
どうも、返事が遅くなりました。 > これはまたえらく複雑なことをしていますね。 そうなんですよね。 正規表現はPerlの要の一つなんですけどどうも苦手で...。 (苦手意識があるから余計に難しく感じているのかも) > 5.10で確認して起きないということであれば、Perlのバグとみて > よいかと思います。 > 5.8→5.10で内部構造的に結構変わっているので、該当するバグの > フィックスがあったかどうか > というのはわかりません。 他のPerl 5.10.0で確認はしていないので明確なところは分かりませんが 可能性は高そうです。 すべて確認したのはOSがWinでPerlもActive Perlなので他のPerlでは どうなのかも分かりませんが本番機もWin+Active Perl 5.8.8でしかも 勝手にバージョンアップとかするわけに行かないということもあり、 スクリプトの方を修正せざるを得ない状況です。 最初、本番機でテストしてみようとしたらヘッダを出力しているにも 関わらず何故かヘッダがないと怒られまして何故だろうといろいろ 調べてみるとどうやらPerlが強制終了してそれまでSTDOUTに出力した 内容が消失していたみたいです。 > sub regex とその中で作っている無名サブルーチンで、同じような > my $foobra = shift というパターンをしているのがちょっと気に > なるといえば気になります。 > サブルーチンが増えるというのが気にならないのであれば、 > 現在無名サブルーチンになっているのを名前をつけて独立した > サブルーチンにした上で > 置換部で呼び出してみたらどうでしょうか? my宣言しているので大丈夫なはず...とは思いましたが一応、 やってみました。 しかし、やはり同様のようです。 不思議なのが前回書いたように何かの処理を行ったりprintで不要な 文字列を出力させたりすると発生しなくなったりすることがあると いう点です。 上記にも書いたようにPerlが強制終了しているようなのでやはり Perlのバグの可能性は濃厚です。 と同時に問題の起こっている正規表現部分も実際には意図したとおりに 動いているようなのですが、間違っている可能性が高く自信がないので 同様の動作をしながらもっと適切な書き方があったらよろしくお願い します。 $$str には複数行の文字列が入っていてその中から$patternにマッチ する特定のパターンを抽出し(このパターンは複数行&同一行で複数回 パターンにマッチする可能性あり)それを特定の変数などに置換、 それで変換した結果、そのパターンがあった行がスペースのみになった 時はすべて除去、みたいな感じです。 (一部説明が間違っているかも) 具体的には http://oshiete1.goo.ne.jp/qa4213045.html の質問の 回答から試行錯誤した上で自分で考え出した正規表現なのですが非常に ややこしくなっています。 まだ、上記の質問も締め切っていませんので宜しければそちらも お願いします。