MATLAB - 使用'clear'时运行对象析构函数?

时间:2011-08-29 22:17:04

标签: matlab oop destructor matlab-class

假设我有一个班级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指定了一个析构函数来进行适当的清理并删除一些对它的引用; {@ 1}}不会调用此析构函数。清除对象时是否可以调用该析构函数?

编辑:我应该提一下,如果没有对clear对象的引用,delete会自动调用clear,我会有另一个类,比如说myClass具有引用myOtherClass的属性,例如myClassmyOtherClass.a中还有其他属性不是myOtherClass的属性,但如果myClass也为空则它们应为空。如果这没有意义,请告诉我,这可能有点过于冗长。

1 个答案:

答案 0 :(得分:11)

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

句柄图形“对象”与myClass不是同一类型的“对象”,figure()返回的“句柄图形句柄”与名为{{的类不同。 1}}你继承自。 handle谈论“处理图形句柄”的那段话不适用于你的对象。请参阅help clear并点击相关doco的doc handle方法链接。

不要心疼; Matlab doco没有明确区分这些区别。 (IIRC它甚至没有明确使用术语“MCOS”;它只是将它们称为“对象”。)基本上,doco中“面向对象编程”部分下的材料与“对象”的类型相关, “处理”你正在处理delete。 “图形”和“GUI开发”下的doco正在谈论另一种处理图形类型的“对象”和“句柄”。我认为他们对句柄图形内容使用术语“句柄”,对OOP内容使用“句柄类”。

要验证您的myClass是否有效,只需进行一个简单的课程。

delete

然后创建一个并清除它。

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

如果未调用析构函数,则可能存在对象延迟的其他引用。每次清除保存对象引用的变量时,只有在清除了引用(或间接引用)的最后一个变量时,才会调用析构函数。