다음을 통해 공유


Interop 마샬러를 사용한 메모리 관리

interop 마샬러에서는 항상 비관리 코드에 의해 할당된 메모리를 해제하려고 시도합니다. 이 동작은 COM 메모리 관리 규칙에 따라 수행되지만 네이티브 C++에 적용되는 규칙과는 다릅니다.

포인터에 대한 메모리를 자동으로 해제하는 플랫폼 호출을 사용할 때 메모리가 해제되지 않는 네이티브 C++ 동작을 예상한다면 혼란스러울 수 있습니다. 예를 들어, C++ DLL에서 관리되지 않는 다음 메서드를 호출하면 모든 메모리가 자동으로 해제됩니다.

관리되지 않는 시그니처

BSTR MethodOne (BSTR b) {
     return b;
}

그러나 메서드를 플랫폼 호출 프로토타입으로 정의하고 각 BSTR 형식을 String 형식으로 바꾼 뒤 MethodOne을 호출하면 공용 언어 런타임에 의해 b의 해제가 두 차례 시도됩니다. String 형식 대신 IntPtr 형식을 사용하여 마샬링 동작을 변경할 수 있습니다.

런타임의 경우 항상 CoTaskMemFree 메서드를 사용하여 메모리를 해제합니다. 작업 대상 메모리가 CoTaskMemAlloc 메서드를 통해 할당된 것이 아니면 IntPtr과 적합한 메서드를 사용하여 메모리를 수동으로 해제해야 합니다. 마찬가지로 커널 메모리에 포인터를 반환하는 Kernel32.dll의 GetCommandLine 함수를 사용하는 경우와 같이 메모리를 절대 해제하지 말아야 하는 상황에서 자동 메모리 해제를 피할 수 있습니다. 메모리를 수동으로 해제하는 방법에 대한 자세한 내용은 Buffers 샘플을 참조하십시오.

참고 항목

개념

방향 특성

Blittable 형식 및 비 Blittable 형식

복사 및 고정

기타 리소스

기본 마샬링 동작