Tutorial: メモリ管理

メモリ管理

Synthesizer V Studio のスクリプトシステムは、参照カウントを使用し、

  • オブジェクトの共有
  • ホスト(ハードコードされたメモリ管理でネイティブコードを実行する)とクライアント(ガベージコレクションを使用する)の間の所有権を安全な移転

を実現します。

ほとんどの場合、基本的なメカニズムを意識しなくとも、スクリプト作者はメモリ安全で問題なく動作するコードを書くことができます。ほとんどの誤用はスクリプト環境によって検出され、「削除されたオブジェクトへのアクセスに失敗しました」などのエラーメッセージがポップアップするからです。しかし、検出されず、非常にまれにクラッシュの原因となるエッジケースはありえます。

マネージドオブジェクトとアンマネージドオブジェクト

  • NestedObject は、親を持たない場合、クライアント環境によってガベージコレクトされる可能性があります(マネージド)。ただしトップレベルオブジェクト(ホスト所有、例えばメインプロジェクト)である場合、その限りではありません。
  • NestedObject が親を持つ場合、それは常に アンマネージド です。

例えば、スクリプトを使用して NoteGroup が作成され、そこにいくつかのノートが追加されている場合、

  • ノートグループ (マネージド)
    • ノート 1 (アンマネージド)
    • ノート 2 (アンマネージド)
    • ノート 3 (アンマネージド)
    • オートメーション 1 (アンマネージド)
    • オートメーション 2 (アンマネージド)
    • ...

NoteGroup がクライアントによってガベージコレクトされると、NoteGroup のホスト側デストラクタが起動され、アンマネージドなすべての子 NoteGroup をクリーンアップします。

クライアント環境で NoteGroup のアンマネージドなノートへの参照がある場合、アンマネージドなノートが削除されると(つまり、親 NoteGroup がガベージコレクションされたとき、あるいはユーザが明示的にノートを削除したときのどちらか)、その参照は削除されたものとしてマークされます。無効な参照へのアクセスは検出され、「削除された 'Note' オブジェクトへのアクセスに失敗しました」というエラーメッセージが表示されます。

マネージドな NoteGroupProject に追加すると、アンマネージドなオブジェクトに変換されます。この変換は、ガベージコレクションのバイパスを知らせる単純な状態変化であり、メモリの割り当て/開放/コピーを伴いません。