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

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

Инструкции и ограничения

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

Похожие темы