ありがちなメモリーリークとその対処法

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

アプリ開発をおこなっていると、必ずと言っていいほどメモリーリークが問題になってくる。これはかなり頭を悩ませられるが、是非とも対処したいものである。

メモリーリークは多くの場合、以下のいずれかが原因になる。これらはまだ原因がわかりやすいため、比較的対処がしやすい。

  • 解放すべきところで解放を忘れた。
  • 循環参照が発生している。

前者はC言語やC++で見られるものである。このケースは解放を忘れてしまったことによるメモリーリークのため、どこで不要になるのかを判断した上で、適切に解放処理を加えれば良いだろう。

なお、このケースでは、ガベージコレクションを導入した環境では基本的に問題は発生しない。

後者ではガベージコレクションを導入した環境、特に参照カウンターによるものでは問題になるパターンである。これはあるオブジェクトAが、別のオブジェクトBを参照し、コールバックなどでオブジェクトBが参照元のAを参照している場合が問題となる。

このパターンではAとBがお互いに参照している状態となり、どのオブジェクトからも参照されなくなった場合でもAとBの参照が残っているので解放されないということになるというものである。

対処法として、これは根本的なものではないが、オブジェクト間の主従関係を把握した上で、メモリー管理においては参照として扱わない弱い参照を使用し、循環参照の弊害を軽減することが考えられる。

他にもOSやランライムの問題などもあるが、これらは対処が難しいと考えられる。

メモリーリークはデバッガーを使わないとなかなかわからないので面倒ではあるが、早い段階で対処したいところである。

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