句柄 类 的 Matlab 代码生成在循环中重新分配

Matlab Code Generation for Handle Classes Reallocated in a Loop

我 运行 对 Matlab Coder 中的一些我不完全理解的行为很感兴趣。为简化起见,这里有一个展示行为的简短示例。如果我有句柄 class 定义为:

classdef somehandleclass < handle %#codegen

properties
    something
end

methods
    function obj = somehandleclass(initval)
        obj.something = initval;
    end
end

end

和一个使用它的简短函数:

function result = runsomehandleclass %#codegen

obj = somehandleclass(0);
for i=1:6
    obj = somehandleclass(i);
end

result = obj.something;

end

...然后我用一个简单的构建脚本构建 runsomehandleclass 函数:

cfg = coder.config('mex');
cfg.GenerateReport = true;
codegen -config cfg runsomehandleclass

我收到以下错误:

??? Unsupported allocation. An allocated handle object escapes the loop. Error in ==> runsomehandleclass Line: 5 Column: 11

我理解错误的文本,显然我每次通过循环都在创建 somehandleclass 的新实例。我的问题是:为什么那会是一个错误?在这个简单的例子中,解决这个问题很简单,但问题出现在一个更大的代码库中,在另一个函数的深处,一个句柄 class 用完全不同的设置重新实例化。我可以(并且已经)解决这个问题,但新的解决方案就没那么优雅了。实际上,这里没有泄漏,因为句柄 classes 应该在句柄被覆盖时被删除。

如果我从 handle 中删除继承并将 class 设为值 class,则错误消失并且 mex 按预期进行编译,但是在我的实际应用程序中,我希望有句柄 class.

这是编译器的预期行为吗?另外,是否有解决方法,例如,在我将新实例构造到 obj 之前,是否有某种方法可以显式删除 obj

here,这是你的情况。

obj = somehandleclass(i);中,在循环外初始化的obj引用了一个在循环内创建的somehandleclass对象。换句话说,如果要在循环中使用它,请使用值 class。