2013-05-17 3 views
0

참조 (C# 또는 Java)가 있어도 어떻게 객체를 삭제할 수 있습니까? 예를 들어메모리에서 객체를 강제로 제거합니다.

:

나는 그것을 할 수있는 방법을 메모리에서 _person을 삭제할
void Main() 
{ 
    var f = new Foo(); 
    var person = f.GetPerson(); 

} 

public class Foo 
{ 
    private object _person; 

    public Foo() 
    { 
     _person = new object(); 
    } 

    public object GetPerson() 
    { 
     return _person; 
    } 
} 

?

+1

_person이 가비지 수집 대상이되지만 가비지 수집기가 메모리에서 제거 할 때 확신 할 수 없습니다. – PermGenError

+0

@PermGenError는 불행하게도 Main 메서드에서 _person에 액세스 할 수 없습니다. – Neir0

+0

@ Neir0 Foo에 set_person (watever)이 없습니까? – PermGenError

답변

11

간단히 입력 할 수 없습니다.

비슷한 결과를 얻으려면 프록시을 통해 Person을 참조하고 프록시를 전달할 수 있습니다. 따라서 기본 Person 참조를 null로 설정할 수 있습니다 (객체를 제거에 사용할 수 있음을 나타냄 - 은 제거하지 않고).하지만 클라이언트에는 여전히 프록시 참조가 포함됩니다.

약한/부드러운 참조가 다른 곳에서도 사용 가능하지만 가비지 수집주기 중에 관련있는 Java SoftReferences and WeakReferences을 체크 아웃하고 오브젝트를 휴지통으로 만들 수 있습니다.

0

관리되는 언어로 된 참조로 메모리에서 개체를 제거 할 수 없습니다.

당신은

1

는 기본적으로, 당신은 살아있는 참조를 무효화 할() 참조를 null로 설정하고 GC.Collect를 호출하여 C#으로 메모리에서 제거 할 수 있습니다. 이것은 자동 메모리 관리로 언어의 주요 가정을 깨뜨릴 것입니다. 이것은 잘못된 포인터를 제거 할 수 없다는 것입니다. Java에서 적어도 이것은 불가능한 일이며 C# 전문가가이 커뮤니티 위키에 C# 관련 정보를 제공하도록 초대합니다. 귀하의 요구 사항의 해결을 향해

: 당신은 다른 내부 개체에 대한 참조를 캡슐화해야하며, 그 기준의 100 % 소유권을 확보 할 수 있도록 는 기준 탈출을주지 않았다. 따라서 외부 객체는 복제 된 내부 객체의 완전한 API를 가져야합니다. 기본적으로 Decorator 패턴입니다.

이렇게하면 언제든지 내부 참조를 null으로 설정하여 안정적으로 개체를 해제 할 수 있습니다.

관련 문제