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

时间:2019-06-05 01:40:05

标签: c++ matlab mex

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

0 个答案:

没有答案