Передача объекта дескриптора в C ++ приводит к утечке ссылки? - PullRequest
3 голосов
/ 05 июня 2019

Я сталкивался с этой проблемой при отладке простого цикла for, в котором время итерации со временем будет расти.Кажется, проблема связана с тем фактом, что передача объекта дескриптора в функцию CEX 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

На самом деле, если вы вставите больше работы послево втором цикле вы можете видеть, что дескрипторы не удаляются до завершения сценария.

Это известная проблема и есть ли способ обойти ее?

Такое же поведение подтвержденона Matlab R2018a на Linux и Matlab R2018b и R2019a на Windows

...