C++ 将句柄对象传递给C++;导致参考泄漏?

C++ 将句柄对象传递给C++;导致参考泄漏?,c++,matlab,mex,C++,Matlab,Mex,我在调试一个简单的for循环时遇到了这个问题,迭代时间会随着时间的推移而增加。这个问题似乎源于将句柄对象传递给C++ MeX函数的事实,它延长了句柄的生命周期,直到脚本结束。 下面是一个再现该问题的最低示例 首先,该类只允许我们跟踪对象何时被删除: classdef Foo < handle methods function this = Foo() end function delete(this) disp("DELETE FOO"); end end end

我在调试一个简单的for循环时遇到了这个问题,迭代时间会随着时间的推移而增加。这个问题似乎源于将句柄对象传递给C++ MeX函数的事实,它延长了句柄的生命周期,直到脚本结束。 下面是一个再现该问题的最低示例

首先,该类只允许我们跟踪对象何时被删除:

classdef Foo < handle
methods
  function this = Foo()
  end
  function delete(this)
    disp("DELETE FOO");
  end
end
end
使用以下工具编译此文件(使用\u Foo.cpp):

最后,测试脚本:

index=0;
而指数~=3
v=Foo();
清除v;
指数=指数+1;
结束
disp(“常规循环结束”);
指数=0;
而指数~=3
v=Foo();
与_Foo(v);%将句柄传递给C++ MEX函数
清除v;
指数=指数+1;
结束
disp(“工作结束,带有“Foo循环”);
它提供了以下输出:

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 R2019a、R2018b也证实了相同的行为。

在清除工作区中的句柄之前,是否尝试调用v.delete?尝试以下操作:删除(v),然后清除vYes。事实上,这会正确地调用
Foo
的析构函数,但是如果您显著地增加循环迭代次数(例如从3次增加到1000000次),您可以看到两件事:1。在最后一次
disp
调用之后,脚本末尾出现了明显的延迟(表明正在进行一些清理),如果对没有将对象传递给mex函数2的循环执行相同操作,则不会发生这种延迟。如果你tic/toc循环体,它需要越来越多的时间(编辑:在输入点2之前意外发送),我猜延迟是由于你需要销毁对象的时间。关于循环迭代和tic/to c。。。当然,正如你所知道的,MATLAB不是C++…这是一种解释性语言。如果你需要删除v,我会说你需要调用delete。如果我显式删除循环中的对象,就会发生延迟。关键是要说明Matlab跟踪很多不应该有的临时对象,它似乎是通过将它传递给C++ MeX函数来触发的。
DELETE FOO
DELETE FOO
DELETE FOO
End of regular loop
End of work_with_Foo loop
DELETE FOO
DELETE FOO
DELETE FOO