当在matlab中销毁变量时,如何销毁我的mex文件中的内存?

时间:2013-03-16 08:55:51

标签: matlab mex

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

1 个答案:

答案 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来创建一个在最后一个副本被清除时自动被调用的回调。

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