我正在处理 mex 文件中的一些内存并将句柄传回 matlab。有没有办法处理用户清除或删除存储在 matlab 变量中的特定句柄的事件,所以我知道它也可以在 mex 文件中删除。
1 回答
听起来您正试图将 MEX 层内管理的分配的生命周期与使用它们的 M 代码级结构的生命周期联系起来。您可能希望将这些原始uint64
句柄值包装在支持清理回调的 Matlab 数据结构中。
handle
您可以将它们包装在您定义的 Matlab子类中,并给它一个delete
调用您ocl_mex
进行适当清理的方法。Delete
是一个析构函数,当从 Matlab 工作区中清除对象的最后一个副本时,将自动调用。(一旦你使用了对象,你可以提供与各种 ocl_mex 调用形式相对应的更简洁的方法,更好的显示,也许*
是使用运算符重载的乘法语法等等。)参见http://www.mathworks.com /help/matlab/matlab_oop/handle-class-destructors.html了解详情。如果您随后将 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
来创建一个回调,当最后一个副本被清除时,它会自动被调用。
问题是您必须确保对句柄的所有访问都通过对象或结构,并且没有任何东西将其弹出并“泄漏”原始句柄值。更容易用对象强制执行。