MATLAB - запустить деструктор объекта при использовании 'clear'? - PullRequest
10 голосов
/ 30 августа 2011

Предположим, у меня есть класс myClass < handle.Со страницы Справка Mathworks на clear,

При удалении дескрипторов графических дескрипторов сами объекты не удаляются, а при удалении объектов не удаляются переменные, хранящие их дескрипторы.

hf = figure;  % Creates figure object, stores handle in variable hf
delete(hf)    % Removes figure object, but not the variable hf
clear hf      % Removes hf from the workspace; figure could still exist

Таким образом, clear объект дескриптора не удаляет его из памяти, если я явно delete не сначала

Я указал деструктор для myClass, чтобы сделать правильноочистить и удалить некоторые ссылки на него;этот деструктор не призван clear.Можно ли вызвать этот деструктор, когда мой объект очищен?

РЕДАКТИРОВАТЬ: я должен упомянуть, что хотя delete автоматически вызывается с clear, если нет ссылок на объект myClass, яесть другой класс, скажем myOtherClass со свойствами, которые ссылаются на myClass, скажем myOtherClass.amyOtherClass есть также другие свойства, которые не являются свойствами myClass, но они должны быть пустыми, если myOtherClass.a также пусто.Дайте мне знать, если это не имеет смысла, возможно, это было слишком многословно.

1 Ответ

11 голосов
/ 30 августа 2011

Очистка всех ссылок на объект класса дескриптора удалит его из памяти, и метод delete на вашем myClass будет автоматически вызываться при уничтожении объекта.Это просто неудачная запутанная терминология.Ваш myClass - это «класс MCOS» или «объект MCOS», а не «дескриптор графического объекта», о котором говорит help clear.Это разные вещи, по крайней мере, на уровне кода М.

Графические «объекты» - это не тот тип «объекта», как у myClass, и «дескриптор графической ручки», возвращаемыйfigure() - это не то же самое, что класс с именем handle, от которого вы наследуете.Этот отрывок из help clear, в котором говорится о «дескрипторах ручки графики», не относится к вашему объекту.См. doc handle и перейдите по ссылке для delete метода для соответствующего документа.

Не расстраивайтесь;Matlab Doco не делает эти различия очень четкими.(IIRC даже явно не использует термин «MCOS»; он просто называет их «объектами».) По сути, материал в разделе «Объектно-ориентированное программирование» в документе относится к виду «объект» и«ручка», над которой вы работаете с myClass.В документах «Графика» и «Разработка GUI» говорится о другом виде графики дескриптора - «объект» и «дескриптор».Я думаю, что они используют термин «дескриптор» для графического материала дескриптора и «класс дескриптора» для материала ООП.

Чтобы убедиться, что ваш delete работает, просто создайте тривиальный класс.

classdef myClass < handle
    methods
        function delete(obj)
        disp('delete was called');
        end
    end
end

А затем создайте и очистите его.

>> x = myClass
x = 
  myClass handle with no properties.
  Methods, Events, Superclasses
>> clear x
delete was called
>> 

Если ваш деструктор не вызывается, могут существовать другие ссылки на задержку объекта.Деструктор не вызывается каждый раз, когда очищается переменная, содержащая ссылку на объект, только когда очищается последняя переменная, содержащая ссылку (или косвенную ссылку).

...