Генерация кода для деструкторов классов Handle

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

Похожие темы