문제

나는 손잡이가 일종의 포인터이지만 그렇지 않다고 들었으며, 객체 자체가 아닌 물체에 대한 참조를 유지할 수 있다고 들었습니다. 더 정교한 설명은 무엇입니까?

도움이 되었습니까?

해결책

손잡이는 정수 색인에서 커널 공간의 리소스에 이르기까지 모든 것이 될 수 있습니다. 아이디어는 그들이 리소스의 추상화를 제공하므로 리소스 자체에 대해 많이 알 필요가 없다는 것입니다.

예를 들어, Win32 API의 HWND는 창의 핸들입니다. 그 자체로는 쓸모가 없습니다 : 당신은 정보를 얻을 수 없습니다. 그러나 올바른 API 기능으로 전달하면 다양한 트릭을 수행 할 수 있습니다. 내부적으로 HWND를 GUI의 Windows 테이블에 대한 색인으로 생각할 수 있습니다 (반드시 구현 된 방법은 아니지만 마법이 의미가 있습니다).

편집 : 질문에서 구체적으로 무엇을 요구했는지 100% 확실하지 않습니다. 이것은 주로 순수한 C/C ++에 대해 이야기하고 있습니다.

다른 팁

핸들은 가시 유형이 부착되지 않은 포인터 또는 인덱스입니다. 보통 당신은 다음과 같은 것을 볼 수 있습니다.

 typedef void* HANDLE;
 HANDLE myHandleToSomething = CreateSomething();

따라서 코드에서는 손잡이를 불투명 한 값으로 전달합니다.

객체를 사용하는 코드에서 포인터를 실제 구조 유형에 시전하고 사용합니다.

 int doSomething(HANDLE s, int a, int b) {
     Something* something = reinterpret_cast<Something*>(s);
     return something->doit(a, b);
 }

또는 배열/벡터의 색인으로 사용합니다.

 int doSomething(HANDLE s, int a, int b) {
     int index = (int)s;
     try {
         Something& something = vecSomething[index];
         return something.doit(a, b);
     } catch (boundscheck& e) {
         throw SomethingException(INVALID_HANDLE);
     }
 }

손잡이 ~이다 그것은 일반적으로 일부 엔티티를 참조하는 방법이라는 점에서 일종의 포인터입니다.

포인터가 한 유형의 핸들이지만 모든 핸들이 포인터라고 말하는 것이 더 정확합니다.

예를 들어, 핸들은 또한 메모리 테이블에 대한 일부 인덱스 일 수 있으며, 이는 일부 객체에 대한 포인터가 포함 된 항목에 해당합니다.

중요한 것은 "손잡이"가있을 때, 당신은 그 핸들이 실제로 어떻게 식별되는 것을 식별하는지 알거나 신경 쓰지 않는다는 것입니다.

또한 "핸들이 정확히 무엇인지"에 대한 단일 답변이 없다는 것도 명백해야합니다. 왜냐하면 같은 시스템에서도 다른 것들에 대한 핸들은 "후드 아래"다른 방식으로 구현 될 수 있기 때문입니다. 그러나 그러한 차이점에 대해 걱정할 필요는 없습니다.

C ++/CLI에서 핸들은 GC 힙에있는 물체에 대한 포인터입니다. (관리되지 않은) C ++ 힙에 객체 생성을 사용하여 달성됩니다. new 그리고 a의 결과 new 표현은 "정상적인"포인터입니다. 관리되는 객체는 GC (Managed) 힙에 다음으로 할당됩니다. gcnew 표현. 결과는 손잡이가 될 것입니다. 손잡이에서 포인터 산술을 할 수 없습니다. 당신은 무료 핸들이 아닙니다. GC는 그들을 돌볼 것입니다. 또한 GC는 관리 된 힙의 객체를 무료로 재배치하고 프로그램이 실행중인 동안 핸들을 새 위치를 가리 키도록 업데이트 할 수 있습니다.

이것은의 맥락에서 나타납니다 핸들 바디 아이디어, PIMPL 관용구라고도합니다. 실제 데이터를 다른 클래스 객체로 유지함으로써 라이브러리의 ABI (Binary Interface)를 동일하게 유지할 수 있습니다.이 클래스에 대한 포인터에 의해 참조되는 다른 클래스 객체에 단순히 참조됩니다. 신체".

또한 두 객체의 일정한 시간과 예외 안전한 스왑을 가능하게하는 것이 유용합니다. 이를 위해서는 단지 신체 물체를 가리키는 포인터 만 교체해야합니다.

손잡이는 당신이 원하는 모든 것입니다.

핸들은 일부 조회 테이블에 사용되는 서명되지 않은 정수 일 수 있습니다.

핸들은 더 큰 데이터 세트에 대한 포인터 일 수 있습니다.

핸들을 사용하는 코드의 동작 방식에 따라 다릅니다. 핸들 유형을 결정합니다.

용어의 이유 '핸들'사용 된 것이 중요합니다. 이는 객체의 식별 또는 액세스 유형으로 나타냅니다. 즉, 프로그래머에게 '키'를 나타냅니다. 또는 무언가에 대한 접근.

HANDLE hnd; 와 같다 void * ptr;

핸들은 Visual Studio (Windows)의 winnt.h 파일에 정의 된 typedef입니다.

typedef void *HANDLE;

자세한 내용을 읽으십시오 핸들

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top