Oop Matlab:清除期间未调用类析构函数?
在Matlab中,我有一节课Oop Matlab:清除期间未调用类析构函数?,oop,matlab,destructor,Oop,Matlab,Destructor,在Matlab中,我有一节课 classdef myClass properties % some properties here... end methods ( Access = 'public' ) function obj = myClass() % constructor... end function obj = delete( obj ) % su
classdef myClass
properties
% some properties here...
end
methods ( Access = 'public' )
function obj = myClass()
% constructor...
end
function obj = delete( obj )
% suppose to be destructor...
fprintf(1, 'delete\n');
end
end % public methods
end
当我清除类型为myClass的变量时,Matlab的默认行为是什么?
例如:
>> m = myClass();
>> clear m
我希望Matlab在这个阶段调用m
的析构函数,但它似乎没有
我的问题:
清除变量时,如何强制调用析构函数
清除变量时调用析构函数不是更合乎逻辑吗
handle
派生的类才有析构函数(delete方法)handle
类确实有一个析构函数:delete
,该函数在类被销毁时调用。有关句柄
类析构函数的更多详细信息,请参见
如果希望为值类提供类似析构函数的功能,Jona的回答提出了一种利用onCleanup
功能的方法
谢谢你的回答和有见地的评论 仅定义为句柄类的类析构函数,而不是值类(因此,Q4的答案是“是”,请参阅前面的文档链接)。值类的工作方式非常类似于标准的Matlab数组,因为它们是通过值传递的,而不是通过引用传递的,而且许多内部构件(如析构函数)对用户是隐藏的。作为交换,它们通常更快(参见示例)
因此,如果您希望调用delete方法,我建议您使用该功能(请注意,delete(m)
实际上不会删除任何内容,因此您可能希望将其设置为私有方法)
可能重复:@DennisJaheruddin-我怀疑这两个问题是相关的,但不是重复的,因为这里的讨论涉及从
handle
超类派生的类。我同意Shai的观点,这是一个不同(而且有趣)的问题。本页底部似乎有一些关于最后问题的相关信息@丹尼斯·杰鲁丁-我会调查的-谢谢!谢谢你的回答。然而,难道没有更直接的方法来定义在类实例被删除/清除时调用的析构函数吗?我更像是一个C++ OOP人,所以我真的不明白为什么MATLAB正在使这个析构函数不那么重要…@ SaaI:如果你来自C++ OOP,我建议使用句柄类而不是值类——析构函数按预期工作,你通过引用,这两个都是你希望从C++中得到的特征。@ Shai:我已经扩展了我的答案来明确地触摸问题3和4。
classdef myTestClass
properties
% some properties here...
end
properties (Hidden)
cleanup
end
methods ( Access = 'public' )
function obj = myTestClass()
% constructor...
obj.cleanup = onCleanup(@()delete(obj));
end
end
methods ( Access = 'private' )
%# I suggest hiding the delete method, since it does not
%# actually delete anything
function obj = delete( obj )
fprintf(1, 'delete\n');
end
end % public methods
end