Я сталкиваюсь с некоторым поведением в Matlab Coder, которое я не совсем понимаю. Для упрощения, вот небольшой пример, демонстрирующий поведение. Если у меня есть класс ручки, определенный как:
classdef somehandleclass < handle %#codegen
properties
something
end
methods
function obj = somehandleclass(initval)
obj.something = initval;
end
end
end
и короткую функцию для его использования:
function result = runsomehandleclass %#codegen
obj = somehandleclass(0);
for i=1:6
obj = somehandleclass(i);
end
result = obj.something;
end
... затем я создаю функцию runsomehandleclass
с помощью простого скрипта сборки:
cfg = coder.config('mex');
cfg.GenerateReport = true;
codegen -config cfg runsomehandleclass
Я получаю следующую ошибку:
??? Неподдерживаемое размещение. Выделенный объект дескриптора выходит из цикла. Ошибка в ==> runomehandleclass Строка: 5 Столбец: 11
Я понимаю текст ошибки, очевидно, я создаю новые экземпляры somehandleclass
каждый раз в цикле. Мой вопрос: почему это должно быть ошибкой? В этом простом примере это легко обойти, но проблема возникает в гораздо большей базе кода, где глубоко в другой функции реинстанцируется класс дескриптора с существенно другими настройками. Я могу (и пытался) обойти это, но новое решение гораздо менее элегантно. На самом деле утечки здесь нет, поскольку предполагается, что классы дескрипторов удаляются при перезаписи их дескрипторов.
Если я удалю наследование от handle
и сделаю класс классом значений, ошибка исчезнет, и mex будет компилироваться должным образом, однако в моем реальном приложении я действительно хочу иметь класс дескриптора.
Это ожидаемое поведение компилятора? Кроме того, есть ли обходной путь, например, есть ли способ явно удалить obj
, прежде чем я создам новый экземпляр в obj
?