将句柄对象传递给 C++ 会导致引用泄漏?

Peb*_*ebs 5 c++ matlab mex

我在调试一个简单的 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 上已经确认了相同的行为。