Можно сгенерировать код для кода MATLAB®, который использует методы delete
(деструкторы) для классов Handle. Чтобы выполнить операции по зачистке местности, такие как закрытие ранее открытого файла перед, объект уничтожается, используйте метод delete
. Сгенерированный код вызывает метод delete
в конце времени жизни объекта, даже если выполнение прервано ошибкой времени выполнения. Когда Системные объекты уничтожаются, delete
вызывает метод release
, который в свою очередь вызывает пользовательский releaseImpl
. Для получения дополнительной информации о том, когда задать метод delete
в коде MATLAB, смотрите Деструктор Класса Handle (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
, чтобы уничтожить частично созданный объект.