Подтвердить что ты не робот

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.

Спасибо за хороший ответ и проницательные комментарии!

4b9b3361

Ответ 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