메모리 할당 규칙 요약
다음 표에서는 메모리 할당과 관련된 주요 규칙을 요약합니다.
MIDL 요소 | 설명 |
---|---|
최상위 수준 [ ref] 포인터 | null이 아닌 포인터여야 합니다. |
함수 반환 값 | 새 메모리는 항상 포인터 반환 값에 할당됩니다. |
[ unique, out] 또는 [ ptr, out] 포인터 | MIDL에서 허용되지 않습니다. |
null에서 null이 아닌 값으로 변경되는 최상위가 아닌 [unique, in, out] 또는 [ptr, in, out] 포인터 | 클라이언트 스텁은 반환할 때 클라이언트에 새 메모리를 할당합니다. |
null이 아닌 에서 null로 변경되는 최상위가 아닌 [unique, in, out] 포인터 | 메모리는 클라이언트에서 분리됩니다. 클라이언트 애플리케이션은 메모리를 해제하고 누수 방지를 담당합니다. |
null이 아닌 에서 null로 변경되는 최상위가 아닌 [ptr, in, out] 포인터 | 별칭이 지정되지 않으면 클라이언트에서 메모리가 분리됩니다. 클라이언트 애플리케이션은 이 경우 메모리 누수 해제 및 방지를 담당합니다. |
[ref] 포인터 | 클라이언트 애플리케이션 계층은 일반적으로 할당합니다. |
null이 아닌 [in, out] 포인터 | 스텁은 클라이언트의 기존 스토리지에 쓰려고 시도합니다. [string] 및 크기가 클라이언트에 할당된 크기를 초과하여 증가하면 반환 시 GP 오류가 발생합니다. |
다음 표에서는 키 IDL 및 ACF 특성이 메모리 관리에 미치는 영향을 요약합니다.
MIDL 기능 | 클라이언트 이슈 | 서버 문제 |
---|---|---|
[ allocate(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 는 할당에 사용해야 합니다. |
[ in]attribute | 데이터에 대한 메모리 할당을 담당하는 클라이언트 애플리케이션입니다. | 스텁을 통해 서버에 할당됩니다. |
[ out] 특성 | 스텁을 통해 클라이언트에 할당됩니다. | [out]-only 포인터는 [ref] 포인터여야 합니다. 스텁을 통해 서버에 할당됩니다. |
[ ref] 특성 | 포인터에서 참조하는 메모리는 클라이언트 애플리케이션에서 할당해야 합니다. | 스텁으로 관리되는 최상위 및 첫 번째 수준 참조 포인터입니다. |
[ unique] 특성 | null이 아닌 경우 메모리가 분리될 수 있습니다. null에서 null이 아닌 경우 클라이언트 스텁이 midl_user_allocate 호출합니다. | (클라이언트에 영향을 줍니다.) |
[ ptr] 특성 | ([ unique]를 참조하세요.) | ([ unique]를 참조하세요.) |