我在mex文件中处理一些内存并将句柄传递给matlab。有没有办法处理用户清除或删除存储在matlab变量中的特定句柄的事件,我知道它也可以在mex文件中删除。
答案 0 :(得分:3)
听起来您正试图将MEX层内部管理的分配生命周期与使用它们的M代码级结构的生命周期联系起来。您可能希望将这些原始uint64
句柄值包装在支持清理回调的Matlab数据结构中。
您可以将它们包装在您定义的Matlab handle
子类中,并为其提供一个delete
方法,调用您的ocl_mex
进行相应的清理。 Delete
是一个析构函数,当从Matlab工作区清除对象的最后一个副本时,它将自动被调用。 (一旦你使用了对象,你可以提供更多简洁的方法,对应于各种ocl_mex调用表单,更好的显示,可能*
使用运算符重载进行乘法的语法,等等。)参见{{3}有关细节。如果然后将mex函数作为类中的私有函数,这可以很好地工作。可以轻松地为mex访问等添加调试日志记录和健全性检查。
代码看起来有点像这样。
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
来创建一个在最后一个副本被清除时自动被调用的回调。
问题是你必须确保对句柄的所有访问都通过对象或结构,并且没有任何东西弹出它并“泄漏”原始句柄值。更容易使用对象强制执行。