循環参照の確認はかなり面倒

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

意図せぬタイミングですでに解放したはずのオブジェクトの処理が動いてしまい、とんでもないバグに遭遇してしまったが、どうやら循環参照が発生していたようだ。循環参照は様々な理由から非常に悩まされるものである。

循環参照は、参照カウンター方式を使っているプログラミング言語、例えば、Objective-C ((Auto Reference Counting有効時。無効時は手動で参照カウントを行う)) やSwiftなどにおいて、あるオブジェクトAとオブジェクトBが互いに参照しあっている時、その参照しあっているオブジェクト以外からの参照がなくなっても、参照カウントが0にならずに解放されないというバグである。

このバグの困ったところは、コンパイル時にエラーや警告が出ることはほとんどなく、実際に走らせた段階で時折変な挙動をするか、一定以上使った時にメモリー不足が発生した時にクラッシュするという形で現れることがある、あるいはデバッガーを使ってメモリーリークが発生したというパターンでしか判別できない場合が多い。

従って、どこで循環参照が発生しうるのか、自力で調べる必要があり非常に面倒なことになってしまう。

個人的には、循環参照が発生している箇所を特定してくれるような静的解析ツールが欲しいところではあるが、どうしたものか。

タイトルとURLをコピーしました