이 질문에는 이미 답변이 있습니다.
내 회사의 일부 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이 발생할 수있는 경우가 있습니까?
감사!
이는 범위에 따라 다릅니다.
주어진 예에서,o
속성의 범위 내에서만 정의됩니다. 그래서 쓸모가 없을 것입니다. 그러나 말하다.o
수업의 범위 내에 있었다. 그렇다면 그것은 다음과 같은 상태를 나타낼 수 있습니다.o
.
현재로서는 필요하지 않습니다.
적어도 두 가지 이유가 있습니다. 첫째,이 패턴을 사용하면 변수를 재사용함으로써 발생하는 버그를 일관성있게 파악할 수 있습니다 (즉, 코드의 큰 시퀀스의 일부인 경우 변수 이름 'o'는 나중에 실행시 다른 객체를 보유 할 수 있음). 명시 적으로 null을 지정하면 나중에 같은 객체를 사용하려고하면 오류가 발생합니다 (큰 블록 인 경우 실수로 생성자를 주석 처리했다고 가정).
둘째, null을 할당하면 개체가 GC에 의해 수집 될 가능성이 있습니다. 클래스 변수에서 더 중요한 반면, 지역 변수조차도 잠재적으로 이익을 얻을 수 있습니다. 객체가 존재하지 않기 때문에독서과제에 의해 기존의 최적화가 과제를 포함하여 영향을받지 않아야합니다 (그러나 불필요한 과제 임). 비슷하게, 할당 자체는 (오브젝트가 연속적으로 액세스되지 않는 경우) 완전히 최적화 될 수도 있지만, 이러한 최적화가 컴파일러의 권한이기 때문에이 구조를 사용하면 포함되지 않은 대체 컴파일 모델을 더 빨리 수집 할 수 있습니다 그러한 최적화.
내가 소유하고있는 것보다 C #언어 사양에 대한 지식이 더 필요합니다.하지만 개체가 아니라고 생각합니다.절대로 필요한 것마지막 액세스 직후 수집을 위해 할당됩니다. 단일 컴파일러 또는 컴파일러 그룹의 현재 동작을 기반으로 한 이런 종류의 가정은 나중에 동일한 원칙을 따르지 않는 환경으로 이식하려고 할 때 더 많은 작업을 할 수 있습니다.
잠재적 인 메모리 누수에 대해서는 GC가 올바르게 작동하고 객체가 특별한 처리를 요구하지 않는다고 가정 할 때 아무런 문제가 없어야합니다. 실제로 사용되지 않은 메모리에 대한 잠재적 인 참조를 제거하여 가능하면 회수 할 수 있습니다. 특수 처분 요구 사항이있는 오브젝트의 경우, 같은 장소에서 처리해야합니다.