【发布时间】: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