다음 표에서는 메모리 할당과 관련된 주요 규칙을 요약합니다.
| MIDL 요소 | 묘사 |
|---|---|
| 최상위 [ ref] 포인터 | null이 아닌 포인터여야 합니다. |
| 함수 반환 값 | 새 메모리는 항상 포인터 반환 값에 할당됩니다. |
| [ 고유, ] 또는 [ ptr, out] 포인터 | MIDL에서 허용되지 않습니다. |
| null에서 null이 아닌 값으로 변경되는 최상위가 아닌 [고유, , ] 또는 [ptr, in, out] 포인터 | 클라이언트 스텁은 반환할 때 클라이언트에 새 메모리를 할당합니다. |
| 비-최상위 [고유, , ] 포인터가 null이 아닌 경우 null로 변경 | 메모리는 클라이언트에서 분리됩니다. 클라이언트 애플리케이션은 메모리를 해제하고 누수 방지를 담당합니다. |
| 비-최상위 [ptr, , ] 포인터가 null이 아닌 경우 null로 변경 | 별칭이 지정되지 않은 경우 클라이언트에서 메모리가 분리됩니다. 클라이언트 애플리케이션은 이 경우 메모리 누수의 해제 및 방지를 담당합니다. |
| [ref] 포인터 | 클라이언트-애플리케이션 계층은 일반적으로 할당합니다. |
| null이 아닌 [, 출력] 포인터 | 스텁은 클라이언트의 기존 스토리지에 쓰려고 시도합니다. [string] 및 크기가 클라이언트에 할당된 크기를 초과하여 증가하는 경우 반환에 GP 오류가 발생합니다. |
다음 표에서는 키 IDL 및 ACF 특성이 메모리 관리에 미치는 영향을 요약합니다.
| MIDL 기능 | 클라이언트 문제 | 서버 문제 |
|---|---|---|
| [ 할당(single_node)], [allocate(all_nodes)] | 메모리 함수에 대해 하나 이상의 호출이 이루어지는지 여부를 결정합니다. | 클라이언트와 동일하며, 프라이빗 메모리는 종종 할당(single_node) [in] 및 [in,out] 데이터에 사용할 수 있습니다. |
| [allocate(free)] 또는 [allocate(dont_free)] | (없음; 서버에 영향을 줍니다.) | 각 원격 프로시저 호출 후 서버의 메모리가 해제되는지 여부를 결정합니다. |
| 배열 특성 [ max_is] 및 [ size_is] | (없음; 서버에 영향을 줍니다.) | 할당할 메모리 크기를 결정합니다. |
| [ byte_count] | 클라이언트는 버퍼를 할당해야 합니다. 클라이언트 스텁에 의해 할당되거나 해제되지 않습니다. | ACF 매개 변수 특성은 서버에 할당된 버퍼의 크기를 결정합니다. |
| [ enable_allocate] | 일반적으로, 없음. 그러나 클라이언트는 다른 메모리 관리 환경을 사용할 수 있습니다. | 서버는 다른 메모리 관리 환경을 사용합니다. RpcSmAllocate 할당에 사용해야 합니다. |
| [ ]특성의 | 데이터에 대한 메모리 할당을 담당하는 클라이언트 애플리케이션입니다. | 스텁을 통해 서버에 할당됩니다. |
| [ out] 특성 | 스텁을 통해 클라이언트에 할당됩니다. | [out]-only 포인터는 [ref] 포인터여야 합니다. 스텁에 의해 서버에 할당됩니다. |
| [ ref] 특성 | 포인터에서 참조하는 메모리는 클라이언트 애플리케이션에서 할당해야 합니다. | 스텁에서 관리하는 최상위 및 첫 번째 수준 참조 포인터입니다. |
| [ 고유] 특성 | null이 아닌 경우 메모리가 분리될 수 있습니다. null에서 null이 아닌 경우 클라이언트 스텁이 midl_user_allocate호출합니다. | (클라이언트에 영향을 줍니다.) |
| [ ptr] 특성 | ([고유]을 참조하세요.) | ([고유]을 참조하세요.) |