句柄类析构函数的代码生成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初始化的所有属性gydF4y2Ba
MyClassgydF4y2Ba
这一gydF4y2Ba删除gydF4y2Ba
的方法gydF4y2BaMyClassgydF4y2Ba
在构造函数中使用或作为默认属性值使用。如果gydF4y2Ba删除gydF4y2Ba
尝试访问未以这两种方式之一初始化的属性时,代码生成器将生成错误消息。gydF4y2Ba假设有一个属性gydF4y2Ba
prop1gydF4y2Ba
的gydF4y2BaMyClass1gydF4y2Ba
本身是一个对象(另一个类的实例gydF4y2BaMyClass2gydF4y2Ba
).初始化的所有属性gydF4y2BaMyClass2gydF4y2Ba
这一gydF4y2Ba删除gydF4y2Ba
的方法gydF4y2BaMyClass1gydF4y2Ba
用途。的构造函数中执行此初始化gydF4y2BaMyClass2gydF4y2Ba
或作为默认属性值。如果gydF4y2Ba删除gydF4y2Ba
的属性gydF4y2BaMyClass2gydF4y2Ba
如果没有以这两种方式之一初始化,代码生成器将产生错误消息。例如,定义这两个类gydF4y2BaMyClass1gydF4y2Ba
而且gydF4y2BaMyClass2gydF4y2Ba
:gydF4y2BaclassdefgydF4y2BaMyClass1 < 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
代码生成器产生错误消息,因为您没有初始化该属性gydF4y2Ba
obj2.prop2gydF4y2Ba
这一gydF4y2Ba删除gydF4y2Ba
方法显示。gydF4y2Ba
对象在生成代码和生成代码中的行为差异gydF4y2BaMATLABgydF4y2Ba
在这些情况下,生成代码中对象的行为可能与MATLAB中的行为不同:gydF4y2Ba
在MATLAB中,几个独立对象的破坏顺序可能与生成的代码中不同。gydF4y2Ba
生成的代码中对象的生存期可能与MATLAB中的生存期不同。MATLAB调用gydF4y2Ba
删除gydF4y2Ba
当不再能从任何活动变量联系到对象时,请使用方法。生成的代码调用gydF4y2Ba删除gydF4y2Ba
当对象超出作用域时,方法。在某些情况下,这种差异会导致gydF4y2Ba删除gydF4y2Ba
在生成的代码中调用,而不是在MATLAB中调用。例如,定义类:gydF4y2BaclassdefgydF4y2BaMyClass < 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
的第二个实例之后,任何活动变量都不能再访问第一个对象gydF4y2Ba
obj = 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
对于那个对象。gydF4y2BaMATLAB调用gydF4y2Ba
删除gydF4y2Ba
方法销毁部分构造的对象。gydF4y2Ba