Main Content

ハンドル クラス デストラクターのコード生成

ハンドル クラス用の delete メソッド (デストラクター) を使用する MATLAB® コードのコードを生成できます。オブジェクトが破棄される前に以前に開いたファイルを閉じるなど、クリーンアップ操作を実行するには、delete メソッドを使用します。実行が実行時エラーによって中断されたとしても、生成されたコードはオブジェクトの存続期間の最後に delete メソッドを呼び出します。System object が破棄されると、deleterelease メソッドを呼び出し、今度はユーザー定義の releaseImpl を呼び出します。MATLAB コードで delete メソッドを定義する場合の詳細については、ハンドル クラスのデストラクターを参照してください。

ガイドラインと制限

MATLAB コードを作成する場合、次のガイドラインおよび制限に従います。

  • コード生成は、delete メソッドの再帰呼び出しをサポートしません。あるクラスの delete メソッドの内部で、それと同じクラスのオブジェクトを作成しないでください。この使用方法により、delete の再帰呼び出しが発生し、エラー メッセージが表示される場合があります。

  • 生成されたコードでは、オブジェクトがスコープ外になるときに常に delete メソッドが呼び出されます。コード生成は delete メソッドの明示的な呼び出しをサポートしていません。

  • MyClassdelete メソッドが使用する MyClass のすべてのプロパティは、コンストラクター内または既定のプロパティ値として初期化します。delete がこれらの 2 つの方法のいずれかで初期化されていないプロパティにアクセスしようとすると、コード ジェネレーターによってエラー メッセージが生成されます。

  • MyClass1prop1 プロパティ自体がオブジェクト (別のクラス MyClass2 のインスタンス) であるものとします。MyClass1delete メソッドが使用する 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 メソッドを呼び出して、部分的に作成されたオブジェクトを破棄します。

関連するトピック