0

LibXML :: XML :: Document#findのドキュメントには、セグメンテーション違反を回避するために次のコードスタイルを使用する必要があると記載されています。

nodes = doc.find('/header')
nodes.each do |node|
  ... do stuff ...
end

これが私がする必要があるすべてですか?サンプルコードボックスの下に、コメントアウトされたコードがあります。

# nodes = nil # GC.start

セグメンテーション違反を確実に回避するために、このコードも含める必要がありますか?コードの最初のブロックに示されているスタイルが参照の問題に大いに役立つとは思いませんでした。コメントアウトされたコードなしで試してみましたが、多数のファイルを処理しても問題はありませんでしたが、まれな状況で発生する可能性があります。

4

1 に答える 1

0

いいえ。コメントアウトされたコードは、作成者が GC との相互作用の問題を心配しているように見えます。フォローアップで言及されているように

プロセスが終了すると、Ruby はノード オブジェクトの前にドキュメント オブジェクトを解放することがあり、それによってセグメンテーション フォールトが発生します。

誰かが尋ねる前に、nodes クラスには、ドキュメントに依存していることを Ruby に伝えるマーク関数があります。マーク機能は問題なく動作し、次の 2 行のコードをテスト コードの最後に追加すれば問題ありません。

ノード = ゼロ

GC.開始


次の理由から、あまり心配する必要はありません。

(a) 問題は 2008 年の図書館に関するものです

(b) 私たちの多くは LibXML を使用しており、使用するのが面倒であるだけでなく、高速で安定しているため、作成者は問題を解決したに違いありません。

代替品をお探しの場合は、こちらをご覧ください

クリス

于 2010-02-19T11:36:49.523 に答える