主要内容gydF4y2Ba

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

你可以为MATLAB生成代码gydF4y2Ba®gydF4y2Ba使用gydF4y2Ba删除gydF4y2Ba句柄类的方法(析构函数)。若要执行清理操作,例如在销毁对象之前关闭先前打开的文件,请使用gydF4y2Ba删除gydF4y2Ba方法。生成的代码调用gydF4y2Ba删除gydF4y2Ba方法在对象生命周期结束时执行,即使执行被运行时错误中断。当系统对象被销毁时,gydF4y2Ba删除gydF4y2Ba调用gydF4y2Ba释放gydF4y2Ba方法,该方法反过来调用用户定义的gydF4y2BareleaseImplgydF4y2Ba.有关何时定义的详细信息gydF4y2Ba删除gydF4y2Ba方法的MATLAB代码,参见gydF4y2Ba句柄类析构函数gydF4y2Ba.gydF4y2Ba

指南和限制gydF4y2Ba

在编写MATLAB代码时,请遵守以下准则和限制:gydF4y2Ba

  • 类的递归调用不支持代码生成万博1manbetxgydF4y2Ba删除gydF4y2Ba方法。中创建某个类的对象gydF4y2Ba删除gydF4y2Ba方法。的递归调用gydF4y2Ba删除gydF4y2Ba并导致错误消息。gydF4y2Ba

  • 生成的代码总是调用gydF4y2Ba删除gydF4y2Ba当对象超出作用域时,请使用方法。类的显式调用不支持代码生成万博1manbetxgydF4y2Ba删除gydF4y2Ba方法。gydF4y2Ba

  • 初始化的所有属性gydF4y2BaMyClassgydF4y2Ba这一gydF4y2Ba删除gydF4y2Ba的方法gydF4y2BaMyClassgydF4y2Ba在构造函数中使用或作为默认属性值使用。如果gydF4y2Ba删除gydF4y2Ba尝试访问未以这两种方式之一初始化的属性时,代码生成器将生成错误消息。gydF4y2Ba

  • 假设有一个属性gydF4y2Baprop1gydF4y2Ba的gydF4y2BaMyClass1gydF4y2Ba本身是一个对象(另一个类的实例gydF4y2BaMyClass2gydF4y2Ba).初始化的所有属性gydF4y2BaMyClass2gydF4y2Ba这一gydF4y2Ba删除gydF4y2Ba的方法gydF4y2BaMyClass1gydF4y2Ba用途。的构造函数中执行此初始化gydF4y2BaMyClass2gydF4y2Ba或作为默认属性值。如果gydF4y2Ba删除gydF4y2Ba的属性gydF4y2BaMyClass2gydF4y2Ba如果没有以这两种方式之一初始化,代码生成器将产生错误消息。例如,定义这两个类gydF4y2BaMyClass1gydF4y2Ba而且gydF4y2BaMyClass2gydF4y2Ba:gydF4y2Ba

    classdefgydF4y2BaMyClass1 < handlegydF4y2Ba属性gydF4y2Baprop1gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Bah = MyClass1(index) h.prop1 = index;gydF4y2Ba结束gydF4y2Ba函数gydF4y2Ba删除(h)流(gydF4y2Ba“h.prop1。prop2is: %1.0f\n', h.prop1.prop2);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba
    classdefgydF4y2BaMyClass2 <句柄gydF4y2Ba属性gydF4y2Baprop2gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

    假设你尝试为这个函数生成代码:gydF4y2Ba

    函数gydF4y2BaMyFunction obj2 = MyClass2;obj1 = MyClass1(obj2);gydF4y2Ba分配obj1。prop1to the input (obj2)结束gydF4y2Ba

    代码生成器产生错误消息,因为您没有初始化该属性gydF4y2Baobj2.prop2gydF4y2Ba这一gydF4y2Ba删除gydF4y2Ba方法显示。gydF4y2Ba

对象在生成代码和生成代码中的行为差异gydF4y2BaMATLABgydF4y2Ba

在这些情况下,生成代码中对象的行为可能与MATLAB中的行为不同:gydF4y2Ba

  • 在MATLAB中,几个独立对象的破坏顺序可能与生成的代码中不同。gydF4y2Ba

  • 生成的代码中对象的生存期可能与MATLAB中的生存期不同。MATLAB调用gydF4y2Ba删除gydF4y2Ba当不再能从任何活动变量联系到对象时,请使用方法。生成的代码调用gydF4y2Ba删除gydF4y2Ba当对象超出作用域时,方法。在某些情况下,这种差异会导致gydF4y2Ba删除gydF4y2Ba在生成的代码中调用,而不是在MATLAB中调用。例如,定义类:gydF4y2Ba

    classdefgydF4y2BaMyClass < handlegydF4y2Ba方法gydF4y2Ba函数gydF4y2Ba删除(h)gydF4y2Ba全球gydF4y2BaggydF4y2Ba析构函数显示全局变量g的当前值gydF4y2Ba流(gydF4y2Ba'全局变量为:%1.0f\n'gydF4y2Bag);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

    运行函数:gydF4y2Ba

    函数gydF4y2BaMyFunctiongydF4y2Ba全球gydF4y2BaG G = 1;obj = MyClass;obj = MyClass;gydF4y2BaMATLAB破坏了这里的第一个对象gydF4y2BaG = 2;gydF4y2BaMATLAB破坏了这里的第二个对象gydF4y2Ba生成的代码破坏这里的两个对象gydF4y2Ba结束gydF4y2Ba

    的第二个实例之后,任何活动变量都不能再访问第一个对象gydF4y2Baobj = MyClassgydF4y2Ba在gydF4y2BaMyFunctiongydF4y2Ba.MATLAB调用gydF4y2Ba删除gydF4y2Ba的第二个实例之后的第一个对象gydF4y2Baobj = MyClassgydF4y2Ba在gydF4y2BaMyFunctiongydF4y2Ba对于函数末尾的第二个对象。输出为:gydF4y2Ba

    全局变量为:1全局变量为:2gydF4y2Ba

    在生成的代码中,两者都是gydF4y2Ba删除gydF4y2Ba当两个对象超出作用域时,方法调用发生在函数的末尾。运行gydF4y2BaMyFunction_mexgydF4y2Ba结果是不同的输出:gydF4y2Ba

    全局变量为:2gydF4y2Ba
  • 在MATLAB中,gydF4y2Ba持续的gydF4y2Ba当无法从任何活动变量获取对象时,对象将被自动销毁。在生成的代码中,必须调用gydF4y2Ba终止gydF4y2Ba函数来销毁gydF4y2Ba持续的gydF4y2Ba对象。gydF4y2Ba

  • 生成的代码不会破坏部分构造的对象。句柄对象在运行时未完全构造,则生成的代码将生成错误消息,但不会调用gydF4y2Ba删除gydF4y2Ba方法。对于系统对象™,如果中存在运行时错误gydF4y2BasetupImplgydF4y2Ba时,生成的代码不调用gydF4y2BareleaseImplgydF4y2Ba对于那个对象。gydF4y2Ba

    MATLAB调用gydF4y2Ba删除gydF4y2Ba方法销毁部分构造的对象。gydF4y2Ba

相关的话题gydF4y2Ba