Можно создать код для кода MATLAB ®, который используетdelete методы (деструкторы) для классов дескрипторов. Для выполнения операций очистки, таких как закрытие ранее открытого файла перед уничтожением объекта, используйте delete способ. Сгенерированный код вызывает delete в конце срока жизни объекта, даже если выполнение прервано ошибкой времени выполнения. При уничтожении объектов системы delete вызывает release метод, который, в свою очередь, вызывает определяемый пользователем releaseImpl. Дополнительные сведения о том, когда определить delete метод в коде MATLAB см. в разделе Деструктор класса дескриптора.
При написании кода MATLAB соблюдайте следующие правила и ограничения:
Генерация кода не поддерживает рекурсивные вызовы delete способ. Не создавать объект определенного класса внутри delete метод для того же класса. Это использование может вызвать рекурсивный вызов delete и вывод сообщения об ошибке.
Сгенерированный код всегда вызывает delete метод, когда объект выходит из области действия. Создание кода не поддерживает явные вызовы delete способ.
Инициализировать все свойства MyClass что delete способ MyClass использует либо в конструкторе, либо в качестве значения свойства по умолчанию. Если delete пытается получить доступ к свойству, которое не было инициализировано одним из этих двух способов, генератор кода выдает сообщение об ошибке.
Предположим, что свойство prop1 из MyClass1 сам является объектом (экземпляр другого класса MyClass2). Инициализировать все свойства MyClass2 что delete способ MyClass1 использует. Выполните эту инициализацию в конструкторе MyClass2 или в качестве значения свойства по умолчанию. Если delete пытается получить доступ к свойству MyClass2 , который не был инициализирован одним из этих двух способов, генератор кода выдает сообщение об ошибке. Например, определите два класса. MyClass1 и MyClass2:
classdef MyClass1 < handle properties prop1 end methods function h = MyClass1(index) h.prop1 = index; end function delete(h) fprintf('h.prop1.prop2 is: %1.0f\n',h.prop1.prop2); end end end
classdef MyClass2 < handle properties prop2 end end
Предположим, вы пытаетесь создать код для этой функции:
function MyFunction obj2 = MyClass2; obj1 = MyClass1(obj2); % Assign obj1.prop1 to the input (obj2) end
Генератор кода выдает сообщение об ошибке, поскольку свойство не инициализировано obj2.prop2 что delete отображается метод.
Поведение объектов в сгенерированном коде может отличаться от их поведения в MATLAB в следующих ситуациях:
Порядок уничтожения нескольких независимых объектов в MATLAB может отличаться от порядка уничтожения в сгенерированном коде.
Время жизни объектов в сгенерированном коде может отличаться от времени жизни объектов в MATLAB. MATLAB вызывает delete метод, когда объект больше не может быть доступен из какой-либо активной переменной. Сгенерированный код вызывает delete метод, когда объект выходит за пределы области действия. В некоторых ситуациях это различие вызывает delete вызываться позже в сгенерированном коде, чем в MATLAB. Например, определите класс:
classdef MyClass < handle methods function delete(h) global g % Destructor displays current value of global variable g fprintf('The global variable is: %1.0f\n',g); end end end
Запустите функцию:
function MyFunction global g g = 1; obj = MyClass; obj = MyClass; % MATLAB destroys the first object here g = 2; % MATLAB destroys the second object here % Generated code destroys both objects here end
Первый объект больше не может быть доступен из любой активной переменной после второго экземпляра obj = MyClass в MyFunction. MATLAB вызывает delete метод для первого объекта после второго экземпляра obj = MyClass в MyFunction и для второго объекта в конце функции. Выходные данные:
The global variable is: 1 The global variable is: 2
В созданном коде оба delete вызовы метода происходят в конце функции, когда два объекта выходят из области действия. Управление MyFunction_mex приводит к другим выводам:
The global variable is: 2 The global variable is: 2
В MATLAB, persistent объекты автоматически уничтожаются, если их невозможно получить из любой переменной. В созданном коде необходимо вызвать terminate функция явным образом для уничтожения persistent объекты.
Созданный код не уничтожает частично построенные объекты. Если объект дескриптора не полностью создан во время выполнения, генерируемый код выдает сообщение об ошибке, но не вызывает delete метод для этого объекта. Для системного object™, если имеется ошибка времени выполнения в setupImpl, сгенерированный код не вызывает releaseImpl для этого объекта.
MATLAB вызывает delete способ разрушения частично построенного объекта.