본문 바로가기
Programming/WPF

C# Dispose. vs GC (Garbage Collection) : 메모리관리

by 곰네Zip 2022. 7. 19.

C#에서는 C++과 다르게 명시적으로 리소스를 해제하는 코드가 (잘)안보인다.

C++에서는 new-delete, alloc - free가 항상 쌍으로 이루어져야했다.

아니면 디버깅 종료시 MemoryLeak을 찾았다고 띄워준다.

근데 C#에서는 이러한 작업을 하지 않아도..

Garbage Collector가 스스로 탐색하면서 사용되지 않는 리소스를 해제해준다.

오오오~~~

근데 이 방법에는 몇가지 주의할게 있다.

1. 관리되지 않는 코드는 GC가 제거할 수 없다. 

2. 동시에 너무 많은 객체 생성등으로 갑자기 메모리를 잡아먹을경우.. 한동안 남아있는다.

2번을 위한 대책으로 리소스가 불필요해진 시점에 GC.Collect()를 호출하면 되기는 한다.

다만.. GC.Collect()가 도는동안 엄청 느려질 것이다.

GC.Collect()가 자주 호출되면 하얀화면을 볼수도-_-;;있다.

 

1번에 유효하고, 2번에도 적용가능한 방법이 있다.

(마소제품이 어설픈것 같아도 있을건 다 있다! 다만 친절히 이런것도 있습니다~ 하고 다 알려주지 않고 찾아봐야 나오는게 문제지..)

 

IDisposable을 상속받아서 Dispose를 구현하는것.

(마소독 : Dispose메소드 구현)

 

IDisposable을 상속받은 객체는 Dispose메소드를 구현하여야한다.

Dispose는 해당 객체가 해제되는 시점에 호출된다. 

관리되지 않는 객체를 해제한다거나 할때.. 해제할객체.Dispose()를 호출하면

이놈은 해제될 대상이 된다.

 

IDisposable을 사용하는 클래스의 코드는 간단(?)하다.

public class MyClass : (BaseClass), IDisposable{
  .. 다른 코드들 ..
  public void Dispose(){
    객체 해제시 수행할 코드들..
  }
}

이 Dispose가 호출되는 객체는 이 메소드 이후에는 해제가 되니, 더이상 참조시켜도 안되고, 이 이후에 무언가를 수행하게 하려고 해도 안된다.

 

C#에서 적절한 메모리 관리를 위해서는 Dispose를 활용하자. GC에게만 너무 맡기지 말고..

반응형

댓글