2010-12-03 3 views
4

질문은 자기 설명 적입니다 :try-catch 블록의 마지막 블록에서 객체를 해제해야합니까?

Foo objfoo; 
try 
{ 
    objfoo = new Foo(); 
    .......... 
    ......... 
} 
catch 
{ 

} 
finally 
{ 
    objfoo = null; 
} 

이 같은 객체를 해제해야합니까?

+0

태그에서 C가 제거되었지만 C 코드가 아닙니다. (나는 resharper가 무엇인지 모른다.) – CashCow

+0

@CashCow - resharper는 IDE 레벨 코드 분석/형식화 도구이다. 아니 정확히 여기 어떻게 적용되는지 확실하지 않다 ... – annakata

+0

resharper 코드 최적화, 나는 그것을 stackoverflow 희망, 그 하나를 의미합니다. – harrisunderwork

답변

13

참고 : 로컬/필드를 null으로 설정하면 값이 해제되지 않습니다. 그 대신에 다음 GC주기 동안 수집을 위해 이해하기 쉬운 값으로 참조를 제거 할 수도 있습니다.

질문에 대답하려면 필요하지 않습니다. JIT는 로컬이 마지막으로 사용 된 시간을 계산하고 그 시간에 객체의 GC 루트 중 하나로서 로컬을 근본적으로 제거합니다. 로컬에서 나가면이 프로세스가 빨라지지는 않습니다.

레이몬드 첸에 훌륭한 기사를했던 바로이 주제

당신은 당신이 시도를 떠나 일단 objFoo가 (코드에 따라) 가비지 컬렉션을받을 수 있습니다로 필요가없는
0

블록. objfoo = null은 다른 코드에 객체에 대한 포인터가 있으면 가비지 수집되지 않습니다.

0

변수에 null을 할당해도 포인터가 가리키는 객체는 삭제되지 않습니다.

메모리 정리에 대해 걱정할 필요가 없습니다. .NET을 사용하는 경우 C#이 자동으로이 작업을 수행합니다.

0

C#에서는 대개 가비지 수집기에서 개체를 비우지 않으므로 그렇지 않습니다. 나중에 null로 설정하면 컴파일러가 코드를 최적화하는 방식에 따라 해당 시점에서 계속 참조되므로 수명이 연장 될 수도 있습니다.

개체의 Dispose() 메서드를 사용하여 처리해야하는 IDisposable을 구현하는 경우는 예외입니다. 그러나 당신은 대개 블록을 사용하여이를 감싸줍니다.

+0

예,이 질문은 IDisposable을 구현하는 개체를 무시한다는 점을 잊어 버렸습니다. – harrisunderwork

0

아니요, 아니요, CLR이 그 일을하도록하십시오.

0

개체가 관리되지 않는 리소스 (파일, 네트워크 공유, 데이터베이스 연결 ...)에 액세스하는 경우가 아니면 범위를 벗어난 가비지 수집으로 표시되므로이 작업을 수행 할 필요가 없습니다.

리소스 (예 : StreamReader 클래스)를 사용하는 경우 개체를 직접 처리해야하지만 using 문을 사용하는 것이 가장 좋습니다.

0

자동 가비지 수집은 메모리 리소스, 즉 새로운 것으로 생성 된 객체를 비울 필요가 없음을 의미합니다.

할당 된 다른 리소스를 해제해야 할 수도 있습니다. 예를 들어 mutex를 잠그고 자신의 프로젝트와 관련된 문맥 (예 : finally 블록이있는 경우).

0

일반적으로이 작업을 수행 할 필요가 없습니다. 함수가 종료하려고하면 개체가 자동으로 가비지 수집 대상이됩니다.

그러나 실제로는 매우 긴 함수가 있거나 블록 블록 이후에 블록을 수행하려고하면 변수를 null로 설정하면 즉시 가비지 수집 대상이됩니다. 예를 들어 Foo이 많은 양의 데이터를 관리하는 경우 이는 좋은 아이디어 일 수 있습니다.