본문 바로가기

C#

관리되는 코드, 관리되지 않는 코드

728x90

[관리되는 코드]
.NET CIL로 작성하고 컴파일 하는 .NET상의 코드 -> GC 메모리 관리가 된다.

[관리되지 않는 코드]
기계 코드를 직접 컴파일 하도록 컴파일되는 .NET에 없는 코드 -> GC 메모리 관리가 안 된다.


[IntPtr - 인터포인터] - 관리되지 않는 메모리 블록에 대한 포인터
정수형 포인터를 의미하는 값 형식의 타입
포인터는 메모리 주소값을 보관하는 곳
IntPtr타입은 메모리 주소를 가리키는 것 외에 윈도우 OS의 핸들값을 보관하는 용도로 쓰인다.

핸들은 윈도우OS가 특정 자원에 대한 식별자로서 보관하는 값인데 일례로 파일이 좋은예다.
파일처리, OS에서 제공되는 것 처리를 할 때 사용된다.


[Marshal Class - 마샬]
관리되지 않는 메모리 블록 <-> 관리되는 데이터 블록

메모리를 할당, 메모리 블록을 복사하는 클래스
Win32 응용 프로그램과 .NET 응용 프로그램을 연결시켜준다.

[Marshal.AllocHGlobal()]
int32, IntPtr가능
지정된 바이트 수 or 포인터를 사용하여, 프로세스의 관리되지 않는 메모리에서 메모리를 할당합니다.

[Marshal.FreeHGlobal(IntPtr)]
프로세스의 관리되지 않는 메모리에서 이전에 할당한 메모리를 해제합니다.

 

[출처]
https://bantree.tistory.com/417

728x90