2012-05-27 2 views
14

내가 DESTROY 메서드를 가진 Perl 클래스를 가지고 있다고 가정 해 봅시다. 이 메서드는 파일 핸들이나 데이터베이스 트랜잭션과 같은 외부 리소스를 암시 적으로 해제하는 데 사용됩니다.어떻게 펄에서 오브젝트를 명시 적으로 파기합니까?

이 클래스의 인스턴스가 주어지면 명시 적으로 삭제하려고합니다. 이것의 주 목적은 DESTROY 메서드를 호출하여 외부 리소스를 해제 할 수있게하는 것입니다. 그러나 "객체"자체를 메모리에서 해제하는 것이 추가 이점이됩니다.

어떻게하면됩니까? DESTROY 메서드를 직접 호출하고 해당 개체를 참조하는 변수를 정의하지 않을 것을 고려했습니다. 당신이 자기 참조 구조 (Destructors하고 흥미로운 정보를 그 후 두 단계 가비지 콜렉션 항 참조)이없는 경우

답변

17

Perl5에 개체는 즉시 그들에게 마지막 참조가 사라질으로 파괴 얻을.

자체 참조가없는 경우 걱정할 필요가없는 경우 DESTROY 메서드가 호출됩니다. 객체를 직접 파괴하려고 시도하는 것은 안전하지 않습니다 (객체가 다른 곳의 참조가 아닌지 어떻게 확신 할 수 있습니까?). 참조 계산을 실제로하지 않는 한 (실제로 가능하다면, 그것은 perl의 노력을 복제 할 것입니다. 그런 좋은 생각이 아니다). 당신은 당신의 코드에서 특정 지점에서 외부 리소스를 해제하려면,

  • release/close에 이렇게 명시 적으로 수행

    그래서 당신이 순환 참조를 가지고 있지 않는 한,라고 말하고 싶지만/dispose/어떤 방법이든 사용할 수 있습니다 (DESTROY 코드도 호출 할 수 있음).

  • 코드의 해당 시점에 해당 릴리스가 실제로 발생하는 것을 신경 쓰지 않는다면 결국에는 결국 호출되므로 걱정하지 마십시오.
  • perl 개체 자체에 대해 걱정하지 마십시오.

순환 참조가있는 경우 훨씬 더 조심해야하며 약한 참조 (Scalar::Util 참조)를 사용하여 순환을 중단해야합니다.

(즉, 내가 명시 적으로 delete 펄 객체가. 그건 참조 카운트 쓰레기 수집 시스템과 잘 작동하지 않을 수있는 방법을 알고하지 않습니다.)

+0

개체가 참조 해제 된 후 정확하게 삭제된다는 것은 확실합니까? 그것을 확인하는 권위있는 출처를 아십니까? 그 종류의 행동은 가비지 컬렉터에 의해 보장되지 않는다고 생각했습니다. – Sam

+1

인용 된 문서 : "개체에 대한 마지막 참조가 사라지면 개체가 자동으로 삭제됩니다". 그러나 내가 말했듯이, 주어진 시점에 외부 리소스를 해제하려는 경우 명시 적으로 설정하십시오. 이것은 perl5 btw를위한 것이며, perl6에는 잠재적으로 차이 수집 스키마가 있습니다. – Mat

4

당신은 확정적 을 사용할 수 있습니다 객체를 명시 적으로 파기합니다. 아래 코드는 그것을 보여줍니다.

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'는 여러분이 제공 한 것이 마지막 참조 일 경우에만 객체를 파괴합니다. 'undef' 전에'my $ Cpy = $ Obj;'를 추가하면, 프로그램이 끝나기 전에 호출 된 destroy가 보이지 않습니다. – Mat

관련 문제