Marshal 클래스는 C#에서 관리되지 않는 메모리와 관련된 작업을 수행하는 데 사용됩니다. 주로 P/Invoke(Platform Invocation Services)와 COM(구성 요소 개체 모델)과 같은 관리되지 않는 코드와 상호 작용할 때 필요합니다. 이 클래스를 사용하면 관리되는 코드(C#)와 관리되지 않는 코드(C/C++) 간의 데이터 전송이나 메모리 관리를 효율적으로 수행할 수 있습니다.
관리되는 메모리: C#과 같은 고급 언어에서 자동으로 메모리가 관리되는 영역입니다. .NET 런타임(가비지 컬렉터)이 메모리를 할당하고 해제합니다. 개발자는 메모리 관리에 대해 걱정할 필요가 없습니다.
관리되지 않는 메모리: C/C++와 같은 저수준 언어에서 직접 메모리를 할당하고 해제해야 하는 영역입니다. 개발자가 메모리 관리를 직접 처리해야 하므로 메모리 누수나 잘못된 메모리 접근 같은 문제가 발생할 수 있습니다.
Marshal 클래스는 다음과 같은 주요 기능을 제공합니다:
Marshal.AllocHGlobal: 관리되지 않는 메모리를 할당합니다. 이 메서드는 필요한 바이트 수를 인수로 받아, 해당 크기의 메모리를 할당하고 포인터를 반환합니다.
IntPtr unmanagedPointer = Marshal.AllocHGlobal(size);
Marshal.FreeHGlobal: AllocHGlobal로 할당한 메모리를 해제합니다.
Marshal.FreeHGlobal(unmanagedPointer);
Marshal.Copy: 관리되는 배열과 관리되지 않는 메모리 간에 데이터를 복사합니다. 예를 들어, 관리되는 배열의 데이터를 관리되지 않는 메모리에 복사하거나 그 반대의 작업을 수행할 수 있습니다.
Marshal.Copy(managedArray, 0, unmanagedPointer, managedArray.Length);
Marshal.PtrToStructure: 관리되지 않는 메모리에서 구조체로 데이터를 복사합니다.
MyStruct myStruct = Marshal.PtrToStructure<MyStruct>(unmanagedPointer);
Marshal.StructureToPtr: 구조체의 데이터를 관리되지 않는 메모리로 복사합니다.
Marshal.StructureToPtr(myStruct, unmanagedPointer, false);
다음은 Marshal 클래스를 사용하여 관리되지 않는 메모리를 할당하고 해제하는 간단한 예시입니다.
using System;
using System.Runtime.InteropServices;
class Program
{
[StructLayout(LayoutKind.Sequential)]
struct MyData
{
public int Number;
public float Value;
}
static void Main()
{
// 관리되지 않는 메모리 할당
IntPtr unmanagedPointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MyData)));
try
{
// 구조체 초기화
MyData data = new MyData { Number = 42, Value = 3.14f };
// 구조체를 관리되지 않는 메모리로 복사
Marshal.StructureToPtr(data, unmanagedPointer, false);
// 메모리에서 구조체로 복사
MyData retrievedData = Marshal.PtrToStructure<MyData>(unmanagedPointer);
Console.WriteLine($"Number: {retrievedData.Number}, Value: {retrievedData.Value}");
}
finally
{
// 메모리 해제
Marshal.FreeHGlobal(unmanagedPointer);
}
}
}
Marshal 클래스는 C#에서 관리되지 않는 메모리와 상호작용하는 데 필요한 메서드를 제공합니다.추가적인 질문이나 더 알고 싶은 내용이 있으시면 말씀해 주세요!
이런 자료를 참고했어요.
[1] 티스토리 - Chapter 11. 추상 데이터 타입 정리 - dev & log - 티스토리 (https://woo-dev.tistory.com/49)
[2] Medium - 자바스크립트의 메모리 관리 (https://medium.com/@2kunhee94/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-f59500b97873)
[3] 델마당 - [답변]] PByte 변수에 어떤 값을 Assign 하려면 (http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=0&indx=345169&page=3892)
[4] 티스토리 - realloc, calloc 함수 및 예제 - 요우의 내맘대로 블로그 - 티스토리 (https://luckyyowu.tistory.com/11)
[5] 네이버 블로그 - C언어 정리하기 - 동적 할당은 조심히! : 네이버 블로그 (http://m.blog.naver.com/ruvendix/220905891439)
[6] 티스토리 - 메모리 관리 전략, 가상메모리 - 조규진의 스터디 블로그 (https://chogyujin-study.tistory.com/10)
[7] F-Lab - 프로그래밍 면접에서 스택과 힙의 차이점 이해하기 (https://f-lab.kr/insight/understanding-stack-and-heap)
[8] 티스토리 - 메모리 동적 할당 및 관리 - 독하게 시작하는 C프로그래밍 (https://js0331.tistory.com/21)
[9] 티스토리 - 11. 주기억장치 할당 기법 - Change Developer - 티스토리 (https://carnival.tistory.com/m/226)
[10] 티스토리 - C/C++ malloc, free를 사용한 메모리 할당 및 해제(1차원, 2차원 ... (https://hijuworld.tistory.com/59)
뤼튼 사용하러 가기 > https://agent.wrtn.ai/5xb91l