mex ファイルで一部のメモリを処理し、ハンドルを matlab に戻しています。ユーザーが matlab の変数に格納されている特定のハンドルをクリアまたは削除するイベントに対処する方法はありますか? mex ファイルでも削除できることがわかっています。
1 に答える
MEX レイヤー内で管理される割り当ての寿命を、それらを使用している M コード レベル構造のライフサイクルにリンクしようとしているようです。uint64
これらの生のハンドル値を、クリーンアップ コールバックをサポートする Matlab データ構造にラップすることをお勧めします。
定義した Matlab サブクラスでそれらをラップし、適切なクリーンアップを行うためにあなたを呼び出すメソッドをhandle
それに与えることができます。はデストラクタであり、オブジェクトの最後のコピーが Matlab ワークスペースからクリアされると自動的に呼び出されます。(また、オブジェクトを使用するようになると、さまざまな ocl_mex 呼び出し形式に対応するより簡潔なメソッド、より適切な表示、演算子のオーバーロードを使用した乗算の構文などを提供できます。) http://www.mathworks.comを参照してください。詳細については、 /help/matlab/matlab_oop/handle-class-destructors.htmlを参照してください。これは、mex 関数をクラス内のプライベート関数にするとうまく機能します。mex アクセスなどのデバッグ ログやサニティ チェックを簡単に追加できます。delete
ocl_mex
Delete
*
コードは次のようになります。
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
、最後のコピーがクリアされたときに自動的に呼び出されるコールバックを作成するために使用することもできます。
落とし穴は、ハンドルへのすべてのアクセスがオブジェクトまたは構造体を通過することを確認する必要があり、何もポップアウトして生のハンドル値を「リーク」しないことです。オブジェクトでより簡単に適用できます。