主要内容

句柄类析构函数的代码生成

您可以为将 delete 方法(析构函数)用于句柄类的 MATLAB® 代码生成代码。要执行清理操作,例如在销毁对象之前关闭以前打开的文件,请使用 delete 方法。生成的代码在对象的生存时间结束时调用 delete 方法,即使执行被运行时错误中断也是如此。当 System object 被销毁时,delete 调用 release 方法,该方法进而调用用户定义的 releaseImpl。有关何时在 MATLAB 代码中定义 delete 方法的详细信息,请参阅句柄类析构函数

规范和限制

当您编写 MATLAB 代码时,请遵守以下规范和限制:

  • 代码生成不支持对 delete 方法的递归调用。不要在一个特定类的 delete 方法中创建同一个类的对象。这种用法可能导致对 delete 的递归调用,并引发错误消息。

  • 当对象超出范围时,生成的代码始终调用 delete 方法。代码生成不支持显式调用 delete 方法。

  • 初始化 MyClass 的所有属性,MyClassdelete 方法在构造函数中会用到这些属性或将其用作默认属性值。如果 delete 尝试访问尚未以上述两种方式之一初始化的属性,代码生成器将生成一条错误消息。

  • 假设 MyClass1 的属性 prop1 本身是对象(另一个类 MyClass2 的实例)。初始化 MyClass1delete 方法使用的 MyClass2 的所有属性。在 MyClass2 的构造函数中或作为默认属性值执行此初始化。如果 delete 尝试访问 MyClass2 中尚未以上述两种方式之一初始化的属性,代码生成器将生成一条错误消息。例如,定义两个类 MyClass1MyClass2

    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

    代码生成器生成一条错误消息,因为您尚未初始化 delete 方法显示的属性 obj2.prop2

生成的代码中和 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

    MyFunctionobj = MyClass 的第二个实例后,从任何实时变量都无法再访问第一个对象。MATLAB 为 MyFunctionobj = MyClass 的第二个实例后的第一个对象以及函数末尾的第二个对象调用 delete 方法。输出为:

    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 方法。对于 System object™,如果在 setupImpl 中存在运行时错误,则生成的代码不为该对象调用 releaseImpl

    MATLAB 确实会调用 delete 方法来销毁部分构造的对象。

另请参阅

主题