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