2

mex ファイルで一部のメモリを処理し、ハンドルを matlab に戻しています。ユーザーが matlab の変数に格納されている特定のハンドルをクリアまたは削除するイベントに対処する方法はありますか? mex ファイルでも削除できることがわかっています。

4

1 に答える 1

3

MEX レイヤー内で管理される割り当ての寿命を、それらを使用している M コード レベル構造のライフサイクルにリンクしようとしているようです。uint64これらの生のハンドル値を、クリーンアップ コールバックをサポートする Matlab データ構造にラップすることをお勧めします。

定義した Matlab サブクラスでそれらをラップし、適切なクリーンアップを行うためにあなたを呼び出すメソッドをhandleそれに与えることができます。はデストラクタであり、オブジェクトの最後のコピーが Matlab ワークスペースからクリアされると自動的に呼び出されます。(また、オブジェクトを使用するようになると、さまざまな ocl_mex 呼び出し形式に対応するより簡潔なメソッド、より適切な表示、演算子のオーバーロードを使用した乗算の構文などを提供できます。) http://www.mathworks.comを参照してください。詳細については、 /help/matlab/matlab_oop/handle-class-destructors.htmlを参照してください。これは、mex 関数をクラス内のプライベート関数にするとうまく機能します。mex アクセスなどのデバッグ ログやサニティ チェックを簡単に追加できます。deleteocl_mexDelete*

コードは次のようになります。

class ocl < handle
    properties (SetAccess = private)
        ocl_handle  # the raw uint64 handle the MEX layer works with
    end
    methods
        function out = ocl(mex_handle) # maybe make this private
           out.ocl_handle = mex_handle;
        end
        function delete(obj)
            if ~isempty(obj.ocl_handle)
               ocl_mex(obj.ocl_handle, 'cleanup');
            end
        end
        function out = mat_mult(A, B)
           handle_c = ocl_mex('mat_mult', A.ocl_handle, B.ocl_handle);
           out = ocl(handle_c); # And now the new handle has a cleanup hook, too...
        end
    end
    methods (Static = true)
        function out = allocate(some_args)
            new_handle = ocl_mex([], 'allocate', some_args);
            out = ocl(new_handle);
        end
    end
end

クラスの使用を避けたい場合は、クラスを単純な構造体に貼り付けてonCleanup、最後のコピーがクリアされたときに自動的に呼び出されるコールバックを作成するために使用することもできます。

落とし穴は、ハンドルへのすべてのアクセスがオブジェクトまたは構造体を通過することを確認する必要があり、何もポップアウトして生のハンドル値を「リーク」しないことです。オブジェクトでより簡単に適用できます。

于 2013-03-17T21:15:03.910 に答える