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

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

Похожие темы