2014-07-13 2 views
2

이것은 매우 기본적인 질문입니다. 일부 메모리 누수를 디버깅하고 완전히 혼란스러워. 다음 내가 가진 가정 :.NET 가비지 컬렉터

public class ObjectData : IDataObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ObjectRepository<T> where T : IDataObject 
{ 
    private Dictionary<int, T> Objects; 

    public ObjectRepository() 
    { 
     Objects = new Dictionary<int, T>(); 
     // load Data 
    } 

    public T GetDataObject(int id); 
    { 
     return Objects[id]; 
    } 

    public Reset() 
    { 
     Objects = new Dictionary<int, T>();; 
    } 
} 

지금은 다음과 같은 프로그램의 흐름이 있다고 가정합니다, 가비지 컬렉터가 처음 생성자에 의해 생성 된 컬렉션을 제거한다 질문입니다

public Main() 
{ 
    var DataRepository = new ObjectRepository<ObjectData>(); 

    // Constructor called and Data loaded 

    var myObject = DataRepository.GetDataObject(1); 

    DataRepository.Reset(); 

    // Call manually the garbage collector or leave it 

    // Program flow continue after this 
} 

? 또는 요소 중 하나가 여전히 프로그램 흐름 (myObject)에서 참조 되었기 때문에 그렇지 않습니다.

답변

1

더 이상 참조가 없으므로 (결국) 수집됩니다. 사전에서 무언가에 대한 참조를 얻는 것은 사전 자체에 대한 참조를 제공하지 않습니다! 그 객체가 어쨌든 내부적으로 사전을 참조하지 않는다면 말입니다.

+0

힌트를 보내 주셔서 감사합니다! 내부 참조에 대해 :) –

1

Reset으로 전화 한 후 초기 dictionary에 대한 강력한 참조 정보가 없습니다. 따라서 가비지 수집을 위해 선출됩니다.

요소 중 하나가 여전히 프로그램 흐름 (myObject)에서 참조 되었기 때문에 발생하지 않습니까?

사전이 어떤 개체를 참조하는지, 누가 누가 사전을 참조하는지는 중요하지 않습니다. 이 경우에는 아무도 없습니다. 내용이 아직 살아있는 동안에도 사전을 수집 할 수 있습니다.

1

질문에 대한 답을 얻으려면 다음을 수행하십시오. 누가 문제의 개체 (이 경우 덮어 쓴 사전)를 참조하고 있습니까?

DataRepository은 아닙니다. 이전 사전을 가리키는 객체 참조를 덮어 썼습니다.

myObjectObjectData에는 입력란의 입력란이 없으므로 없습니다. 사전을 참조 할 수 없습니다.

아무도 이전 사전을 참조 할 권한이 없습니다.