Oop 在MATLAB中清除类定义

Oop 在MATLAB中清除类定义,oop,class,matlab,Oop,Class,Matlab,命令清除类清除当时加载到内存中的所有类定义 是否可以只清除特定的类定义 编辑:我感兴趣的是从内存中删除特定的类定义,而不是类实例。这是一种方法: %设置ClassName以匹配要清除其实例的类的名称 ClassName = 'MyClass'; %代码如下: VarsStruct = whos; VarsCellArray = cat(3, cellstr(char(VarsStruct(:).name)), cellstr(char(VarsStruct(:).class))); Class

命令
清除类
清除当时加载到内存中的所有类定义

是否可以只清除特定的类定义


编辑:我感兴趣的是从内存中删除特定的类定义,而不是类实例。

这是一种方法:

%设置
ClassName
以匹配要清除其实例的类的名称

ClassName = 'MyClass';
%代码如下:

VarsStruct = whos;
VarsCellArray = cat(3, cellstr(char(VarsStruct(:).name)), cellstr(char(VarsStruct(:).class)));
ClassInstanceIndices = find(ismember(VarsCellArray(:,:,2), ClassName));
ClassInstanceNames = VarsCellArray(ClassInstanceIndices,:,1)';
clear(ClassInstanceNames{:});

我自己在编写新的HPF类时遇到了这个问题。所以我尝试了一些方法,因为在调试新类时,我要做很多更改,然后进行测试

“清除功能”没有帮助。我甚至试过“清除hpf”。但清除所有实例似乎确实如此。例如:

>> x = hpf(3);
>> x+2
ans =
5

>> whos
  Name      Size            Bytes  Class     Attributes

  ans       1x1               248  hpf                 
  x         1x1               248  hpf                 
  y         1x1                 8  double              
所以现在我对这个类做了一个小小的更改并保存了它

>> z = hpf(17);
Warning: The class file for 'hpf' has been changed; but the change cannot be applied because objects based on the old class file still exist. If you use
those objects, you might get unexpected results. You can use the 'clear' command to remove those objects. See 'help clear' for information on how to remove
those objects. 

>> clear functions
>> clear hpf
>> clear x
>> clear z
>> x = hpf(3);
Warning: The class file for 'hpf' has been changed; but the change cannot be applied because objects based on the old class file still exist. If you use
those objects, you might get unexpected results. You can use the 'clear' command to remove those objects. See 'help clear' for information on how to remove
those objects. 
所以我仍然得到一个警告,告诉我MATLAB仍然有一个问题。然而,我在内存中仍然有一个很容易忘记的HPF实例,ans

>> clear ans
>> clear x
>> whos
  Name      Size            Bytes  Class     Attributes

  y         1x1                 8  double              

>> x = hpf(3);
>> x+23
ans =
26

只要我也删除了那个实例,MATLAB就不再给我警告了。请注意,我从未发出过“清除类”命令。变量y(一个双精度变量)仍然存在以证明这一事实。

要清除类定义,包括所有常量属性数据,必须执行以下两项操作

  • 从内存中清除类的所有实例
  • 问题
    清除类名

  • 必须按上述顺序进行。颠倒顺序将使常量属性数据停留在内存中(从R2013b开始),直到发出
    清除类

    我想清除类定义,而不是类实例。当然,首先清除类实例是绝对必要的,但我已经知道如何做了。为了完整性,我想补充一点,实例也可以隐藏在图形和其他图形对象的userdata组件中。不幸的是,这并不是对类定义的完全删除。例如,即使删除了所有实例,常量属性数据仍保留在内存中。
    clear
    可以很好地清除各个实例,而不管它们包含什么。是的,但在我在前面的注释中描述的上下文中,它似乎不起作用。你试过了吗?很多次。应用
    clear
    时,应自动调用属性的delete()方法。如果您遇到了一个异常的例子,您应该启动一个线程来演示它,以便更好地检查它。其他提到的都没有记录,但很容易测试。使用包含大数组的常量属性创建类实例。在Windows上,您可以在Tsk Mgr中看到常量属性中的内存没有取消分配,即使在删除对象之后也是如此。这很奇怪,因为我也尝试过很多次。假设
    myobj
    是一个(句柄)类实例,而
    myproperty
    是其包含另一个(句柄)类实例的属性之一,则调用
    clear myobj.myproperty
    似乎不起任何作用。如果
    清除此项,则情况也是如此。myproperty
    是从
    myobj
    的一个方法中调用的。但是,调用
    myobj.myproperty.delete
    似乎实际删除了预期的对象。@niels我们不知道“似乎什么都不做”对您意味着什么。正如我之前所评论的,您应该用明确的示例开始一个线程,包括您用来确定
    clear
    是否有效果的方法。您是说任务管理器显示未释放的内存,还是您使用了其他测试?@niels有两种方法可以看出步骤2的必要性。一个是我描述的测试,即使用任务管理器查看常量属性内存是否已被取消分配。在释放该内存之前,不能将该类视为“已清除”。另一种方法是使用
    inmem
    命令。您将看到,删除所有类实例不会从
    inmem
    返回的列表中删除类名,除非您执行
    清除类名