9

이 질문에는 이미 답변이 있습니다.

내 회사의 일부 C #코드를 정리하고 있는데 주목해야 할 것은이 애플리케이션을 작성한 계약자가 null을 객체 참조로 설정한다는 것입니다.

예:

get {
  Object o = new Object(); // create a new object that is accessed by the reference 'o'
  try {
   // Do something with the object
  }
  finally {
    o = null; // set the reference to null
  }
}

내가 이해하는 것으로부터, 생성 된 객체는 여전히 존재합니다. 다른 참조가 있는지에 따라 현재 액세스 할 수 없지만 GC가 제공되고 정리 될 때까지 계속 존재할 가능성이 있습니다.

마지막으로 차단해야 할 이유가 있습니까? 이 경우에 adverted memory leak이 발생할 수있는 경우가 있습니까?

감사!


  • .NET 메모리 관리가 VB COM 관리와 다른 점을 알아 채지 못하는 Ex VB (클래식) 프로그래머와 비슷합니다. - Damien_The_Unbeliever
  • 좋은 처분 방법이라고 생각합니다. - Matias Cicero
  • @MatiCicero : 아니, 그렇지 않습니다. 이해 부족을 드러내는 전형적인화물 숭배 프로그래밍 사례입니다. - Michael Borgwardt

3 답변


14

이는 범위에 따라 다릅니다.

주어진 예에서,o속성의 범위 내에서만 정의됩니다. 그래서 쓸모가 없을 것입니다. 그러나 말하다.o수업의 범위 내에 있었다. 그렇다면 그것은 다음과 같은 상태를 나타낼 수 있습니다.o.

현재로서는 필요하지 않습니다.


  • 그러나 생성 된 객체는 관계없이 메모리를 차지합니다. null로 설정되어있는 객체에 대한 참조입니다. 개체가 마지막으로 사용 된 시점을 GC가 알지 못하므로 참조를 모두 null로 설정하여 명시 적으로 말하지 않아도됩니까? - CodyEngel
  • 참조가 아직 범위 내에 있으면 null을 설정해야합니다. 즉 GC가 사용하지 않는 것을 알 수있는 방법입니다. - Russell at ISC
  • @ 러셀, 아. GC가 다르게 작동했다고 생각했습니다. - CodyEngel

6

GC가 가능한 빨리 물체를 수집하게하려는 의도라면, 전혀 쓸모가 없습니다.

에 의해 참조 된 객체o다음에 아무데도 사용되지 않습니다.try차단 될 때, 그것은 그것이 마지막으로 사용 된 직후에 (즉, 변수o범위를 벗어나서finally블록).

관련 메모에서 Lippert 's건설 파괴.


  • Eric Lippert의 기사 링크 +1. "스코프 (scope)"의 개념은, C #에서는 중괄호의 중첩과 관련이 거의 없거나 전혀 없습니다. - OldFart

-1

적어도 두 가지 이유가 있습니다. 첫째,이 패턴을 사용하면 변수를 재사용함으로써 발생하는 버그를 일관성있게 파악할 수 있습니다 (즉, 코드의 큰 시퀀스의 일부인 경우 변수 이름 'o'는 나중에 실행시 다른 객체를 보유 할 수 있음). 명시 적으로 null을 지정하면 나중에 같은 객체를 사용하려고하면 오류가 발생합니다 (큰 블록 인 경우 실수로 생성자를 주석 처리했다고 가정).

둘째, null을 할당하면 개체가 GC에 의해 수집 될 가능성이 있습니다. 클래스 변수에서 더 중요한 반면, 지역 변수조차도 잠재적으로 이익을 얻을 수 있습니다. 객체가 존재하지 않기 때문에독서과제에 의해 기존의 최적화가 과제를 포함하여 영향을받지 않아야합니다 (그러나 불필요한 과제 임). 비슷하게, 할당 자체는 (오브젝트가 연속적으로 액세스되지 않는 경우) 완전히 최적화 될 수도 있지만, 이러한 최적화가 컴파일러의 권한이기 때문에이 구조를 사용하면 포함되지 않은 대체 컴파일 모델을 더 빨리 수집 할 수 있습니다 그러한 최적화.

내가 소유하고있는 것보다 C #언어 사양에 대한 지식이 더 필요합니다.하지만 개체가 아니라고 생각합니다.절대로 필요한 것마지막 액세스 직후 수집을 위해 할당됩니다. 단일 컴파일러 또는 컴파일러 그룹의 현재 동작을 기반으로 한 이런 종류의 가정은 나중에 동일한 원칙을 따르지 않는 환경으로 이식하려고 할 때 더 많은 작업을 할 수 있습니다.

잠재적 인 메모리 누수에 대해서는 GC가 올바르게 작동하고 객체가 특별한 처리를 요구하지 않는다고 가정 할 때 아무런 문제가 없어야합니다. 실제로 사용되지 않은 메모리에 대한 잠재적 인 참조를 제거하여 가능하면 회수 할 수 있습니다. 특수 처분 요구 사항이있는 오브젝트의 경우, 같은 장소에서 처리해야합니다.


  • 글의 벽이기 때문에 여기에서 말하고자하는 바가 무엇인지 잘 모르겠습니다. 당신은 단락으로 당신의 대답의 분리 부분을 조사하고 싶을지도 모릅니다. - Damien_The_Unbeliever

연결된 질문


관련된 질문

최근 질문