【问题标题】:MATLAB - run object destructor when using 'clear'?MATLAB - 使用“清除”时运行对象析构函数?
【发布时间】:2011-11-06 09:21:58
【问题描述】:

假设我有一个班级myClass < handle。来自 Mathworks Help page on clear

清除句柄图形句柄不会删除对象本身,删除对象也不会删除存储其句柄的变量。

hf = figure;  % Creates figure object, stores handle in variable hf
delete(hf)    % Removes figure object, but not the variable hf
clear hf      % Removes hf from the workspace; figure could still exist

所以clear处理句柄对象不会从内存中删除它,除非我先明确地delete它..

我为myClass 指定了一个析构函数来进行适当的清理并删除对它的一些引用; clear 不会调用此析构函数。清除对象后是否可以调用该析构函数?

编辑:我应该提一下,虽然 delete 会自动调用 clear 如果没有对 myClass 对象的引用,我还有另一个类,比如 myOtherClass 具有引用 myClass 的属性,比如说myOtherClass.amyOtherClass 中还有其他属性不是myClass 的属性,但如果myOtherClass.a 也为空,则它们应该为空。让我知道如果这没有意义,那可能有点太罗嗦了。

【问题讨论】:

    标签: matlab oop destructor matlab-class


    【解决方案1】:

    清除对句柄类对象的所有引用会将其从内存中删除,并且myClass 上的delete 方法将在对象被销毁时自动调用。不幸的是,这只是令人困惑的术语。您的myClass 是“MCOS 类”或“MCOS 对象”,而不是像help clear 所说的“处理图形对象”。它们是不同的东西,至少在 M 代码级别。

    句柄图形“对象”与您的 myClass 的“对象”类型不同,figure() 返回的“句柄图形句柄”与名为 handle 的类不同你继承自。 help clear 中关于“处理图形句柄”的那段文章不适用于您的对象。请参阅doc handle 并点击链接以获取相关文档的delete 方法。

    别难过; Matlab doco 并没有把这些区别说得很清楚。 (IIRC 它甚至没有明确使用术语“MCOS”;它只是称它们为“对象”。)基本上,文档中“面向对象编程”部分下的材料与“对象”的类型相关,并且“处理”您正在使用myClass。 “图形”和“GUI 开发”下的文档正在讨论另一种句柄图形类型的“对象”和“句柄”。我认为他们使用术语“句柄”来表示句柄图形内容,使用“句柄类”来表示 OOP 内容。

    要验证您的 delete 是否有效,只需创建一个简单的类。

    classdef myClass < handle
        methods
            function delete(obj)
            disp('delete was called');
            end
        end
    end
    

    然后创建一个并清除它。

    >> x = myClass
    x = 
      myClass handle with no properties.
      Methods, Events, Superclasses
    >> clear x
    delete was called
    >> 
    

    如果你的析构函数没有被调用,可能还有其他对对象的引用仍然存在。每次清除持有对该对象的引用的变量时,都不会调用析构函数,只有当最后一个持有引用(或间接引用)的变量被清除时。

    【讨论】:

    • 当然还有其他对延迟对象的引用;我想要这个功能的部分原因是因为我在我的析构函数中摆脱了这些引用。我用相关信息更新了 OP;如果没有完整的上下文,它可能没有意义,但完整的上下文与特别的问题无关..
    • 我也遇到过类似的问题,尤其是在创建自定义 GUI 元素时。我认为清除变量时不可能强制调用析构函数。正如您在问题中指出的那样,您可能只想在清除对象之前简单地调用对象的 delete 方法。
    • 仅供参考,我认为在终端中使用带有面向对象代码的 gui 时,不使用 clear 调用析构函数是一个很好的功能(我发现大多数情况就是这样) .这意味着如果用户不小心使用了clear,即使从工作区清除了 gui 的句柄,您的 gui 也不会关闭。但是,如果用户在句柄上调用delete,析构函数仍然会运行。
    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2015-08-04
    • 1970-01-01
    • 2019-12-30
    • 2013-05-21
    • 1970-01-01
    • 2012-02-05
    • 2013-09-30
    相关资源
    最近更新 更多