2012-05-12 7 views
7

El comando clear classes borra todas las definiciones de clases cargadas en la memoria en ese momento.Borrado de las definiciones de clases en MATLAB

¿Es posible borrar solo las definiciones de clase específicas?

EDIT: Me resulta interesante eliminar de la memoria las definiciones de clase , no las instancias de clase.

Respuesta

4

me encontré con este problema a mí mismo cuando escribí mi nueva clase HPF. Así que probé algunas cosas, ya que mientras depuraba la nueva clase, tuve que hacer muchos cambios y luego probar.

"Borrar funciones" no ayuda. Incluso probé "clear hpf". Pero borrar todas las instancias parece hacerlo. Por ejemplo:

>> 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    

Así que ahora hice un cambio trivial en la clase y la guardé.

>> 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. 

Aún recibo una advertencia, diciéndome que MATLAB todavía tiene un problema. Sin embargo, todavía tenía una instancia de HPF en la memoria que se olvida fácilmente, ans.

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

    y   1x1     8 double    

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

Mientras quite esa instancia también, MATLAB ya no me avisa. Tenga en cuenta que nunca tuve que emitir un comando de "clases claras". La variable y, un doble, todavía existe para probar ese hecho.

+0

para completar Me gustaría agregar que las instancias también pueden ocultarse en los componentes userdata de figuras y otros objetos gráficos. Estos no aparecen con quién. – bdecaf

+1

Desafortunadamente, esta no es una eliminación completamente limpia de la definición de clase. Los datos de propiedades constantes permanecen en la memoria, por ejemplo, incluso después de que se hayan eliminado todas las instancias. –

1

Esta es una manera de hacerlo:

% Set ClassName para que coincida con el nombre de la clase cuyas instancias desea borrar.

ClassName = 'MyClass'; 

% Aquí está el código:

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{:}); 
+0

Me gustaría borrar las definiciones * de la clase, no las instancias de la clase. Por supuesto, limpiar primero las instancias de clase es absolutamente esencial, pero ya sé cómo hacerlo. – niels

0

Para borrar una definición de clase, incluyendo todos los datos de las propiedades constante, es necesario hacer las siguientes dos

  1. claras todas las instancias de la clase de la memoria
  2. Edición clear classname.

Debe hacerse en el orden anterior. Si se invierte la orden, los datos de propiedades constantes quedarán bloqueados en la memoria (a partir del R2013b) hasta que se emita el clear classes.

+0

'clear' debería funcionar bien para borrar instancias individuales, independientemente de lo que contengan. –

+0

* Sí, pero en el contexto que describí en el comentario anterior, parece que no funciona. ¿Lo has intentado? * Muchas veces. El método delete() de la propiedad debe invocarse automáticamente cuando se aplica 'clear '.Si ha encontrado un ejemplo anómalo, debe iniciar un hilo que lo demuestre para que pueda examinarse mejor. Nada más mencionado está documentado, AFAIK, pero es fácil de probar. Cree una instancia de clase con una propiedad Constante que contenga una matriz grande. En Windows, puede ver en Tsk Mgr que la memoria de la propiedad Constant no se desasigna, incluso después de eliminar el objeto. –

+0

Eso es extraño porque también lo he intentado muchas veces. Suponiendo que 'myobj' es una instancia de clase (handle) y 'myproperty' es una de sus propiedades que contiene la instancia de otra clase (handle), la invocación' clear myobj.myproperty' parece no hacer nada. Lo mismo es cierto si se llama a 'clear this.myproperty' desde uno de los métodos de' myobj'. Sin embargo, al invocar 'myobj.myproperty.delete' parece eliminar el objeto como se esperaba. – niels

Cuestiones relacionadas