ハンドル クラス デストラクターのコード生成
ハンドル クラス用の 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
メソッドを呼び出して、部分的に作成されたオブジェクトを破棄します。