【问题标题】:Matlab Code Generation for Handle Classes Reallocated in a Loop循环中重新分配的句柄类的 Matlab 代码生成
【发布时间】:2015-09-04 01:29:43
【问题描述】:

我在 Matlab Coder 中遇到了一些我不完全理解的行为。为简化起见,这里有一个展示该行为的简短示例。如果我有一个句柄类定义为:

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

我收到以下错误:

???不支持的分配。已分配的句柄对象退出循环。 ==> runsomehandleclass 中的错误行:5 列:11

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

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

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

【问题讨论】:

    标签: matlab matlab-coder


    【解决方案1】:

    请参阅here,这是你的情况。

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

    【讨论】:

    • 这或多或少是对我的问题的重述。是的,我知道它是在循环之外创建的,然后(可能)在循环中一遍又一遍地销毁和重新创建。这只是问题的一个简单示例;在我的实际应用程序中,实例化发生在其他代码的深处,但错误和结果是相同的。最好让它成为一个句柄类并在循环中重新调用构造函数。据我所知,这段代码没有理由无效或无法编译。它直接在 MATLAB 中工作。这在某种程度上是被禁止的用例吗?
    • 因为它是 matlab,而不是 C++。您使用它的功能,也必须忍受它的限制。谈到 abt 类和 oop,matlab 从来都不是一个好的选择,也不是主流的选择之一。你看到链接了吗?说的很清楚A Variable Outside a Loop Cannot Refer to a Handle Object Created Inside a Loop
    • 我不打算重述,我指出Matlab在哪里说代码生成不接受您的案例。它是您关于编译器预期行为的问题的答案。
    • 啊哈,感谢您添加链接。这正是我想要的。
    • ...否则你的链接一直都在那里,我错过了。我很抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2012-10-16
    相关资源
    最近更新 更多