다음을 통해 공유


메모리 할당 규칙 요약

다음 표에서는 메모리 할당과 관련된 주요 규칙을 요약합니다.

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] 특성 ([고유]을 참조하세요.) ([고유]을 참조하세요.)