プログラミングでは、しばしばメモリーリークの問題に悩まされる。それが、デバッガーツールなどで検出できるような形であればいいのだが、検出できないタイプのものはかなり面倒である。
C言語やC++においては、言語仕様においてはガベージコレクションがないため ((Boehm GCなどのサードパーティーのライブラリーや、スマートポインターはあるけれど)) 、確保したメモリー領域の解放を手動で行わなければならない。この場合に、メモリー領域の解放を忘れた時は、多くの場合、検出される。
Auto Reference Countingが有効 ((ARC無効の場合は手動で参照カウントの制御を行う)) なObjective-CやSwiftについては、参照カウント形式でガベージコレクションが行われるため、あるオブジェクトAとBがお互いに参照し合っている循環参照が発生しなければ、不要になったタイミングで解放される。またオブジェクトAとBが参照し合っているだけの状態であれば、多くの場合は検出される。この場合は、参照カウントに影響しない弱い参照を使うことで対処できる。
しかしながら、検出されないパターンの場合は面倒である。私が遭遇したパターンでは、あるオブジェクトAとBが互いに強い参照を行なっていて尚且つ片方がSingletonオブジェクトとも互いに参照している場合である。この場合、Singletonオブジェクトは不要となることはないため、実質的には不要になっていて、メモリーリークになっているのに、メモリーリークとして検出されないという状態になってしまう。
この時は、オブジェクトが不要になった時にうまくデストラクターが動いているかを確認することでしか、実質的にメモリーリークが発生しているかを判断するしかなかった。
メモリーリークは結構面倒なことになることもあるため、極力対処したいが、対処のための原因究明がなかなか難しい場合もあるので、メモリーリークになりそうなところを突き止めて、先制的に対処したいところである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。