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