본문 바로가기
C#

garbage collect의 함정

by Falto 2023. 3. 25.

아래 코드는 File object를 만든 후 콜백을 추가한 다음, Length가 Load되면 콜백 함수에서 Items에 file을 추가하는 코드이다.

        public void Add(string file)
        {
            File fileItem = new File(file);
            fileItem.LengthLoaded += FileItem_LengthLoaded;
        }
        private void FileItem_LengthLoaded(File file)
        {
            Items.Add(file);
        }

논리상으로는 아무런 문제가 없다. Length가 load되는 코드에 문제가 있지 않는 이상은 Add가 호출된 횟수만큼 FileItem_LengthLoaded도 호출될 것이다. 하지만 직접 실행시켜보면 예상치 못한 결과가 나온다. Add가 호출된 횟수보다 FileItem_LengthLoaded가 호출된 횟수가 더 작은 것이다. 이건 garbage collect 때문에 그렇다. fileItem에 대한 reference count가 0이 되니까 garbage collector가 file instance를 삭제시켜버리는 것이다.

        List<File> files = new List<File>();
        public void Add(string file)
        {
            File fileItem = new File(file);
            files.Add(fileItem);
            fileItem.LengthLoaded += FileItem_LengthLoaded;
        }
        private void FileItem_LengthLoaded(File file)
        {
            Items.Add(file);
        }

이런 식으로 reference를 유지시켜주면 file instance가 사라지지 않는다.

'C#' 카테고리의 다른 글

class vs struct  (0) 2023.05.18
[C# Windows] System.IO.Path.GetTempPath 쓰지 마라.  (0) 2023.05.09
개발자와 사용자의 관점 차이  (0) 2023.03.14
MultiBinding 간단한 예제  (0) 2023.03.11
인생은 살기 힘들다는데  (0) 2023.03.08

댓글