고유 포인터

C 프로그램에서는 둘 이상의 포인터에 데이터 주소가 포함될 수 있습니다. 포인터는 데이터에 대한 별칭을 만드는 것이라고 합니다. 포인터가 선언된 변수를 가리키는 경우에도 별칭이 만들어집니다. 다음 코드 조각에서는 이러한 두 가지 별칭 지정 방법을 모두 보여 줍니다.

int iAnInteger=50;

// The next statement makes ipAnIntegerPointer an
// alias for iAnInteger.
int *ipAnIntegerPointer = &iAnInteger;

// This statement creates an alias for ipAnIntegerPointer.
int *ipAnotherIntegerPointer = ipAnIntegerPointer;

일반적인 C 프로그램에서는 다음 정의를 사용하여 이진 트리를 지정할 수 있습니다.

typedef struct _treetype 
{
    long               lValue;
    struct _treetype * left;
    struct _treetype * right;
} TREETYPE;

TREETYPE * troot;

둘 이상의 포인터가 트리 노드의 내용에 액세스할 수 있습니다. 이는 일반적으로 비배포 애플리케이션에 적합합니다. 그러나 이 프로그래밍 스타일은 더 복잡한 RPC 지원 코드를 생성합니다. 클라이언트 및 서버 스텁에는 데이터 및 포인터를 관리하는 추가 코드가 필요합니다. 기본 스텁 코드는 주소에 대한 다양한 포인터를 resolve 최신 버전을 나타내는 데이터의 복사본을 결정해야 합니다.

포인터가 애플리케이션이 해당 메모리 영역에 액세스할 수 있는 유일한 방법임을 보장하면 처리량을 줄일 수 있습니다. 포인터에는 여전히 C 포인터의 많은 기능이 있을 수 있습니다. 예를 들어 null 값과 null이 아닌 값 간에 변경하거나 동일하게 유지할 수 있습니다. 다음은 이에 대한 예입니다. 포인터는 호출 전에 null 이고 호출 후 유효한 문자열을 가리킵니다.

null 값과 null이 아닌 값 간에 변경되는 포인터

기본적으로 MIDL 컴파일러는 매개 변수가 아닌 모든 포인터에 [ unique] 포인터 특성을 적용합니다. 이 기본 설정은 [ pointer_default] 특성으로 변경할 수 있습니다.

고유한 포인터에는 다음과 같은 특성이 있습니다.

  • 값이 null일 수 있습니다.
  • 호출 중에 null 에서 null 이 아닌 값으로 변경할 수 있습니다. 값이 null이 아닌 값으로 변경되면 반환 시 새 메모리가 할당됩니다.
  • 호출 중에 null 이 아닌 에서 null 로 변경할 수 있습니다. 값이 NULL로 변경되면 애플리케이션은 메모리를 해제해야 합니다.
  • 값은 null 이 아닌 값에서 다른 값으로 변경할 수 있습니다.
  • 고유한 포인터가 가리키는 스토리지는 작업의 다른 포인터 또는 이름으로 액세스할 수 없습니다.
  • 포인터에 null 값이 없으면 반환 데이터가 기존 스토리지에 기록됩니다.

다음 예제에서는 고유한 포인터를 정의하는 방법을 보여 줍니다.

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0)
]
interface RefPtrInterface
{
  void RemoteFn([in, unique] char *ach);
}

이 예제에서 매개 변수 ach 는 RemoteFn 루틴으로 처리할 서버로 전송되는 문자 데이터에 대한 고유한 포인터입니다.