ハンドル クラス デストラクターのコード生成
ハンドル クラス用の delete メソッド (デストラクター) を使用する MATLAB® コードのコードを生成できます。オブジェクトが破棄される前に以前に開いたファイルを閉じるなど、クリーンアップ操作を実行するには、delete メソッドを使用します。実行が実行時エラーによって中断されたとしても、生成されたコードはオブジェクトの存続期間の最後に delete メソッドを呼び出します。System object が破棄されると、delete は release メソッドを呼び出し、今度はユーザー定義の releaseImpl を呼び出します。MATLAB コードで delete メソッドを定義する場合の詳細については、ハンドル クラスのデストラクターを参照してください。
ガイドラインと制限
MATLAB コードを作成する場合、次のガイドラインおよび制限に従います。
コード生成は、
deleteメソッドの再帰呼び出しをサポートしません。あるクラスのdeleteメソッドの内部で、それと同じクラスのオブジェクトを作成しないでください。この使用方法により、deleteの再帰呼び出しが発生し、エラー メッセージが表示される場合があります。生成されたコードでは、オブジェクトがスコープ外になるときに常に
deleteメソッドが呼び出されます。コード生成はdeleteメソッドの明示的な呼び出しをサポートしていません。MyClassのdeleteメソッドが使用するMyClassのすべてのプロパティは、コンストラクター内または既定のプロパティ値として初期化します。deleteがこれらの 2 つの方法のいずれかで初期化されていないプロパティにアクセスしようとすると、コード ジェネレーターによってエラー メッセージが生成されます。MyClass1のprop1プロパティ自体がオブジェクト (別のクラスMyClass2のインスタンス) であるものとします。MyClass1のdeleteメソッドが使用するMyClass2のすべてのプロパティを初期化します。この初期化をMyClass2のコンストラクターで行うか、既定のプロパティ値として行います。deleteがこれらの 2 つの方法のいずれかで初期化されていないMyClass2のプロパティにアクセスしようとすると、コード ジェネレーターによってエラー メッセージが生成されます。たとえば、2 つのクラスMyClass1およびMyClass2を定義します。classdef MyClass1 < handle properties prop1 end methods function h = MyClass1(index) h.prop1 = index; end function delete(h) fprintf('h.prop1.prop2 is: %1.0f\n',h.prop1.prop2); end end end
classdef MyClass2 < handle properties prop2 end end
この関数のコードを生成しようとするとします。
function MyFunction obj2 = MyClass2; obj1 = MyClass1(obj2); % Assign obj1.prop1 to the input (obj2) end
deleteメソッドが表示するobj2.prop2プロパティが初期化されていないため、コード ジェネレーターによってエラー メッセージが生成されます。
生成されたコードと MATLAB でのオブジェクトの動作の違い
次の状況では、生成されたコードでのオブジェクトの動作は、MATLAB での動作と異なる可能性があります。
複数の独立したオブジェクトを破棄する順序は、生成されたコードと MATLAB では異なる場合があります。
生成されたコードでのオブジェクトの存続期間は、MATLAB での存続期間と異なる可能性があります。ライブ変数からオブジェクトにアクセスできなくなると、MATLAB は
deleteメソッドを呼び出します。生成されたコードは、オブジェクトがスコープ外になるときにdeleteメソッドを呼び出します。状況によっては、この違いにより、deleteの呼び出しが、生成されたコードにおいて MATLAB よりも後になります。たとえば、以下のようなクラスを定義します。classdef MyClass < handle methods function delete(h) global g % Destructor displays current value of global variable g fprintf('The global variable is: %1.0f\n',g); end end end
以下の関数を実行します。
function MyFunction global g g = 1; obj = MyClass; obj = MyClass; % MATLAB destroys the first object here g = 2; % MATLAB destroys the second object here % Generated code destroys both objects here end
MyFunction内のobj = MyClassの 2 番目のインスタンスの後は、ライブ変数から最初のオブジェクトに到達することはできません。MATLAB は、MyFunction内のobj = MyClassの 2 番目のインスタンスの後で最初のオブジェクトに対して、また関数の最後に到達した時点で 2 番目のオブジェクトに対してdeleteメソッドを呼び出します。出力は、次のようになります。The global variable is: 1 The global variable is: 2
生成されたコードでは、2 つのオブジェクトがスコープ外になると、関数の最後に到達した時点で両方の
deleteメソッド呼び出しが発生します。MyFunction_mexの実行結果は、異なる出力になります。The global variable is: 2 The global variable is: 2
MATLAB では、ライブ変数から
persistentオブジェクトに到達できなくなると、このオブジェクトは自動的に破棄されます。生成されたコードでは、persistentオブジェクトを破棄するために関数terminateを明示的に呼び出す必要があります。生成されたコードは、部分的に作成されたオブジェクトを破棄しません。ハンドル オブジェクトが実行時に完全に作成されていない場合、生成されたコードはエラー メッセージを作成しますが、そのオブジェクトの
deleteメソッドは呼び出しません。System object™ について、setupImplで実行時エラーがある場合、生成されたコードは、そのオブジェクトのreleaseImplは呼び出しません。MATLAB は、
deleteメソッドを呼び出して、部分的に作成されたオブジェクトを破棄します。