Можно сгенерировать код для кода 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
метод, чтобы уничтожить частично созданный объект.