Matlab:清除期间没有调用类析构函数?

Sha*_*hai 14 oop matlab destructor

在Matlab我有一堂课

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
Run Code Online (Sandbox Code Playgroud)

当我clear是一个类型的变量时,Matlab的默认行为是myClass什么?例如:

>> m = myClass();
>> clear m
Run Code Online (Sandbox Code Playgroud)

我希望Matlab m在这个阶段调用析构函数,但它似乎没有!

我的问题:

  1. clear在变量变量时如何强制调用析构函数?

  2. 这是Matlab的默认行为吗?clear在变量变量时调用析构函数是不是更合乎逻辑?

  3. 是否有可能Matlab的类没有析构函数方法(也就是说,在销毁类时没有默认方法)?或者我错过了什么?

  4. 是否有可能只有派生的类handle具有析构函数(delete方法)?

谢谢!

编辑:按照乔纳斯的回答,简要总结:

Matlab有两种类型:值类(默认)句柄类(从handle超类派生).值类往往提供更好的性能,但是,它们没有析构函数.

handle类有一个析构函数:delete在类被销毁时调用.有关类析构函数的更多详细信息,请参阅此问题handle.

如果希望为值类具有类似析构函数的功能,Jona的答案提出了一种利用onCleanup功能的方法.

感谢您的好答案和富有洞察力的评论!

Jon*_*nas 13

Delete仅被定义为句柄类的类析构函数,而不是值类(因此Q4的答案为"是",请参阅文档的上一个链接).值类与标准Matlab数组非常相似,因为它们是通过值而不是通过引用传递的,并且许多内部结构(例如析构函数)对用户是隐藏的.作为交换,他们通常更快(参见例如这个SO问题).

因此,如果您想要调用delete方法,我建议使用onCleanup功能(请注意,delete(m)实际上不会删除任何内容,因此您可能希望将其设为私有方法).

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
Run Code Online (Sandbox Code Playgroud)

  • @Shai:如果你来自C++ OOP,我建议使用句柄类而不是值类 - 析构函数按预期工作,你通过引用传递,这两个都是你期望来自C++的特性. (2认同)