自己紹介
大分高専卒業生のジョハンです。
趣味
プログラミングが好きです。
本文
プログラミング/開発の世界でよくある思い込みとして、C/C++、Rust、Zigなどのシステムレベル言語の領域を超えると、解釈型言語に一般的に見られるガベージコレクタのおかげでメモリ管理を心配する必要がないというものがあります(Goは例外の一つです)。しかし、これは完全に正しいわけではなく、Pythonでもメモリリークが実際に発生する可能性があることをお見せします。
学生時代、私はSDLを使用してPythonで4年次プロジェクトのグラフィカルユーザーインターフェイスを作成していました。ガジェット間の通信を容易にするために、割り当てられたタグに基づいてコールバックを実行するグローバル変数としての基本的なイベントバスを実装しました。クラスメソッドをイベントバスのコールバックとして登録すると、タグをキーとしてグローバル辞書内に保存されます。このガジェットを更新する必要がある場合は、そのタグを使用していくつかのデータを渡すだけでした。しかし、ここに問題があります。
アプリケーションは静的なものではなく、そのレイアウトはユーザーデータに応じて常に変化する必要があるため、新しいガジェットを常にアタッチしたり切り離したりする必要があります。しかし、ガジェットのインスタンスを削除しても、そのクラスメソッドの1つ以上がすでにイベントバスに登録されている場合はどうなるでしょうか?それらはCにおけるダングリングポインタのようなものになります - Pythonのガベージコレクタを明示的に呼び出しても、イベントバス辞書内に参照が残っているため、それらは存在し続けます。
もちろん、解決策は簡単です:ガジェットを切り離すときにそれらのコールバックへの参照をすべて明示的に削除する必要があり、問題は解消します。しかし、「メモリ安全」な言語を使用していても、高品質な製品を実際に作成したい場合は、依然としてメモリ管理に気を配る必要があります。