2

我正在处理 mex 文件中的一些内存并将句柄传回 matlab。有没有办法处理用户清除或删除存储在 matlab 变量中的特定句柄的事件,所以我知道它也可以在 mex 文件中删除。

4

1 回答 1

3

听起来您正试图将 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来创建一个回调,当最后一个副本被清除时,它会自动被调用。

问题是您必须确保对句柄的所有访问都通过对象或结构,并且没有任何东西将其弹出并“泄漏”原始句柄值。更容易用对象强制执行。

于 2013-03-17T21:15:03.910 回答