Matlab: Класс деструктор не называется во время очистки?
В Matlab у меня есть класс
classdef myClass
properties
% some properties here...
end
methods ( Access = 'public' )
function obj = myClass()
% constructor...
end
function obj = delete( obj )
% suppose to be destructor...
fprintf(1, 'delete\n');
end
end % public methods
end
Каково поведение по умолчанию Matlab, когда я clear
переменная типа myClass
?
Например:
>> m = myClass();
>> clear m
Я ожидал бы, что Matlab вызовет деструктор m
на этом этапе, но похоже, что это не так!
Мои вопросы:
-
Как принудительно вызвать деструктор при clear
с переменной?
-
Является ли это поведение по умолчанию Matlab в каком-то смысле? Не логичнее ли вызывать деструктор при clear
переменной?
-
Возможно ли, что классы Matlab не имеют метода detructor (т.е. не существует метода по умолчанию, который следует вызывать при уничтожении класса)? Или я чего-то не хватает?
-
Возможно ли, что только классы, полученные из handle
, имеют деструктор (метод delete
)?
Спасибо!
EDIT: после ответ Jonas, краткое резюме:
Matlab имеет два типа классов: классы значений (по умолчанию) и (производные от суперкласса handle
). Классы значений имеют тенденцию обеспечивать лучшую производительность, однако они не имеют функциональности деструктора.
handle
классы имеют функцию деструктора: delete
, которая вызывается, когда класс уничтожается. См. этот вопрос из более подробной информации о деструкторах класса handle
.
Если кто-то хочет иметь деструктор-подобную функциональность для классов значений, ответ Jona предлагает метод, использующий функциональность onCleanup
.
Спасибо за хороший ответ и проницательные комментарии!
Ответы
Ответ 1
Delete определяется только как деструктор класса для классов дескрипторов, а не для классов значений (поэтому ответ на Q4 "да", см. предыдущую ссылку на документацию). Классы значений очень похожи на стандартные массивы Matlab, поскольку они передаются по значению, а не по ссылке, и в том, что многие внутренние элементы, такие как деструкторы, скрыты от пользователя. Взамен они обычно быстрее (см. например этот вопрос SO).
Следовательно, я предлагаю использовать функцию onCleanup, если вы хотите, чтобы вызываемый метод был вызван (обратите внимание, что delete(m)
на самом деле ничего не удалит, поэтому вы можете сделать это частным методом).
classdef myTestClass
properties
% some properties here...
end
properties (Hidden)
cleanup
end
methods ( Access = 'public' )
function obj = myTestClass()
% constructor...
obj.cleanup = onCleanup(@()delete(obj));
end
end
methods ( Access = 'private' )
%# I suggest hiding the delete method, since it does not
%# actually delete anything
function obj = delete( obj )
fprintf(1, 'delete\n');
end
end % public methods
end