句柄类析构函数的代码生成
您可以为将 delete
方法(析构函数)用于句柄类的 MATLAB® 代码生成代码。要执行清理操作,例如在销毁对象之前关闭以前打开的文件,请使用 delete
方法。生成的代码在对象的生存时间结束时调用 delete
方法,即使执行被运行时错误中断也是如此。当 System object 被销毁时,delete
调用 release
方法,该方法进而调用用户定义的 releaseImpl
。有关何时在 MATLAB 代码中定义 delete
方法的详细信息,请参阅句柄类析构函数。
规范和限制
当您编写 MATLAB 代码时,请遵守以下规范和限制:
代码生成不支持对
delete
方法的递归调用。不要在一个特定类的delete
方法中创建同一个类的对象。这种用法可能导致对delete
的递归调用,并引发错误消息。当对象超出范围时,生成的代码始终调用
delete
方法。代码生成不支持显式调用delete
方法。初始化
MyClass
的所有属性,MyClass
的delete
方法在构造函数中会用到这些属性或将其用作默认属性值。如果delete
尝试访问尚未以上述两种方式之一初始化的属性,代码生成器将生成一条错误消息。假设
MyClass1
的属性prop1
本身是对象(另一个类MyClass2
的实例)。初始化MyClass1
的delete
方法使用的MyClass2
的所有属性。在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
代码生成器生成一条错误消息,因为您尚未初始化
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
在
MyFunction
中obj = MyClass
的第二个实例后,从任何实时变量都无法再访问第一个对象。MATLAB 为MyFunction
中obj = 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
方法来销毁部分构造的对象。