我在调试一个简单的for循环时遇到了这个问题,在该循环中迭代时间会随着时间的增长而增加。问题似乎源于以下事实:将句柄对象传递给C ++ MEX函数会延长句柄的寿命,直到脚本结束。
这是重现此问题的最小示例。
首先,该类只是让我们跟踪何时删除对象:
classdef Foo < handle
methods
function this = Foo()
end
function delete(this)
disp("DELETE FOO");
end
end
end
然后,C ++-MEX函数什么都不做:
#include "mex.hpp"
#include "mexAdapter.hpp"
class MexFunction : public matlab::mex::Function
{
public:
void operator()(matlab::mex::ArgumentList /*outputs*/, matlab::mex::ArgumentList /*inputs*/) override
{
}
};
使用以下命令编译(work_with_Foo.cpp)
>> mex work_with_Foo.cpp
最后,测试脚本:
index = 0;
while index ~= 3
v = Foo();
clear v;
index = index + 1;
end
disp("End of regular loop");
index = 0;
while index ~= 3
v = Foo();
work_with_Foo(v); % pass the handle to the C++ MEX function
clear v;
index = index + 1;
end
disp("End of work_with_Foo loop");
哪个提供输出:
DELETE FOO
DELETE FOO
DELETE FOO
End of regular loop
End of work_with_Foo loop
DELETE FOO
DELETE FOO
DELETE FOO
实际上,如果在第二个循环之后插入更多工作,则可以看到在脚本结束之前没有删除句柄。
这是一个已知问题吗,有什么方法可以解决?
在Linux上的Matlab R2018a和Windows上的Matlab R2018b和R2019a上已经确认了相同的行为