exponenta event banner

Создание кода для деструкторов класса дескрипторов

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

Связанные темы