2012-05-27 16 views
14

Digamos que tengo una clase Perl que tiene un método DESTROY. Este método se usa para liberar implícitamente un recurso externo, como un identificador de archivo o una transacción de base de datos.¿Cómo destruyes explícitamente un objeto en Perl?

Dada una instancia de esta clase, me gustaría destruirla explícitamente. El objetivo principal de esto es provocar que se llame al método DESTROY para que se pueda liberar el recurso externo. Sin embargo, tener el "objeto" en sí mismo liberado de la memoria sería un beneficio adicional.

¿Cómo puedo hacer esto? He considerado directamente llamar al método DESTROY y no definir ninguna variable que haga referencia al objeto.

Respuesta

17

objetos Perl5 quedar destruido tan pronto como la última referencia a ellas desaparece, a menos que tenga estructuras auto-referencial (véase el párrafo Destructors y la recolección de basura dos fases después de que por alguna información interesante).

Si no tiene referencias automáticas, no necesita preocuparse por nada, se llamará al método DESTROY cuando sea necesario; tratar de destruir el objeto usted mismo no estaría seguro (¿cómo puede estar seguro de que el objeto no es referencia en otro lugar), a menos que también esté haciendo recuentos de referencia usted mismo (si eso es realmente posible y eso duplicaría los esfuerzos de Perl, que no es una buena idea).

así que diría que, siempre y cuando usted no tiene referencias cíclicas:

  • Si desea liberar los recursos externos en un punto específico en el código, lo hace de forma explícita con un release/close/dispose/cualquier método (que su código DESTROY podría llamar también).
  • Si realmente no te importa que ese lanzamiento ocurra exactamente en ese punto de tu código, solo que finalmente se llama, no te preocupes.
  • No se preocupe por el objeto perl en sí.

Si usted tiene referencias cíclicas, que tendrá que ser mucho más cuidadoso, y utilizar referencias débiles (ver Scalar::Util) para romper los ciclos.

(En otras palabras, no sé de una manera explícita delete un objeto Perl. Eso no funciona bien con un sistema de recolección de basura de referencia contado.)

+0

¿Está seguro de que los objetos se destruirán exactamente después de que no se vuelvan a hacer referencia? ¿Conoces alguna fuente autorizada que lo confirme? Pensé que ese tipo de comportamiento no estaba garantizado por el recolector de basura. – Sam

+1

El documento que cité: "Cuando la última referencia a un objeto desaparece, el objeto se destruye automáticamente". Pero como dije, hágalo explícito si desea liberar recursos externos en un punto determinado. Esto es para perl5 por cierto, perl6 potencialmente tiene un esquema de colección de diferencia. – Mat

4

Usted puede utilizar undef para destruir explícitamente un objeto. El siguiente código lo ilustra.

package MyPackage; 

sub new { 
    print "In new\n"; 
    return bless {}; 
} 

sub DESTROY { 
    print "In DESTROY\n"; 
} 

package main; 

my $Obj = MyPackage->new(); 
<STDIN>; 
undef $Obj; 
<STDIN>; 
+11

'undef' solo destruye el objeto si lo que le das es la última referencia. Intenta agregar 'mi $ Cpy = $ Obj;' antes del 'undef', no verá destruir llamado antes del final del programa. – Mat

Cuestiones relacionadas