検出されないメモリーリークは面倒

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

プログラミングでは、しばしばメモリーリークの問題に悩まされる。それが、デバッガーツールなどで検出できるような形であればいいのだが、検出できないタイプのものはかなり面倒である。

C言語やC++においては、言語仕様においてはガベージコレクションがないため ((Boehm GCなどのサードパーティーのライブラリーや、スマートポインターはあるけれど)) 、確保したメモリー領域の解放を手動で行わなければならない。この場合に、メモリー領域の解放を忘れた時は、多くの場合、検出される。

Auto Reference Countingが有効 ((ARC無効の場合は手動で参照カウントの制御を行う)) なObjective-CやSwiftについては、参照カウント形式でガベージコレクションが行われるため、あるオブジェクトAとBがお互いに参照し合っている循環参照が発生しなければ、不要になったタイミングで解放される。またオブジェクトAとBが参照し合っているだけの状態であれば、多くの場合は検出される。この場合は、参照カウントに影響しない弱い参照を使うことで対処できる。

しかしながら、検出されないパターンの場合は面倒である。私が遭遇したパターンでは、あるオブジェクトAとBが互いに強い参照を行なっていて尚且つ片方がSingletonオブジェクトとも互いに参照している場合である。この場合、Singletonオブジェクトは不要となることはないため、実質的には不要になっていて、メモリーリークになっているのに、メモリーリークとして検出されないという状態になってしまう。

この時は、オブジェクトが不要になった時にうまくデストラクターが動いているかを確認することでしか、実質的にメモリーリークが発生しているかを判断するしかなかった。

メモリーリークは結構面倒なことになることもあるため、極力対処したいが、対処のための原因究明がなかなか難しい場合もあるので、メモリーリークになりそうなところを突き止めて、先制的に対処したいところである。

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