2013-06-19 2 views
1

이것은 HANDLE의 올바른 사용법에 대한 매우 기본적인 질문입니다.핸들은 어떻게 적절하게 관리되고 있습니까?

typedef void* HANDLE; 

HANDLE myHandle; 

myHandle = SomeObject; 

//...some elaborate code...// 
  1. 첫 번째 질문 : myHandle 이제 스택 또는 힙에 위치해 있습니다 (이것은 특정 소스 파일이되지 않음) 다음 코드를 감안할 때? 핸들은 인덱스 일뿐 아니라 포인터가 될 수 있기 때문에 이에 대해서는 확실하지 않습니다.

    지점에서 myHandle이 범위를 벗어났습니다 (적어도 그렇게 생각합니다). 그러나 클래스 멤버 인 경우에는 소유 객체가 삭제 될 때까지 계속 표시됩니다. 그래서 두 번째 질문 :이

    myHandle = 0; // I do not need this handle anymore 
    

    내가 지금 메모리 관리와의 충돌로 실행됩니다, 또는 다른 제한 관리에 관한 할 수있는 좋은 방법이

  2. 내가 myHandle에 더 이상 액세스를 방지하려면입니다 암호? 다른 옵션이 핸들은 포인터에 더 이상 유사한 사용되어서는 안된다는이 명시 다음과 같다

    mypointer = NULL; 
    

편집 : 나는 분명히 C++에 포함되지 않은 첫 번째 장소에서 가비지 컬렉션에 대해 얘기했다. 이 부분은 managed extensions입니다. 이 치명적인 오류로 나를 도와 주셔서 감사합니다!

+1

"포인터는 물론 색인"? "가비지 수집기에서 제거"? 여기에서 무슨 일이 일어나고 있는지 ... 처음부터 시작할 것입니다. 이 질문은별로 의미가 없습니다. –

+2

우선 C++에서 가비지 컬렉터가 없으므로 C++ 메모리 관리에 대해 더 자세히 읽으시기 바랍니다. WinAPI 핸들을 참조하는 경우 핸들을 수행 한 후에 핸들에서 CloseHandle (핸들)을 호출해야합니다. 그러나 다시 C++ 메모리 관리를 연구해야합니다. 그렇지 않으면 더 심각한 문제가 발생할 것입니다. – Kourosh

+0

* 대답 중 * none *이 RAII를 제안하는 이유는 무엇입니까? upvoting 가치가 대답을 줘! – jalf

답변

1

당신은 아마 당신이 만든 가정의 자바 프로그래머 일 것입니다.

변수에 myHandle이 실제로 스택에 할당되며 가비지 수집기가 아니라도 범위를 벗어나면 제거됩니다 (C++에는 그러한 것이 존재하지 않음).

그러나,이 핸들을 (myHandle 일부 불투명 한 숫자 값의 실제 핸들을 OS가 소유를 보유하고 단지 변수 하지 무료 않습니다 - 그래서 수명은의 수명과 동일하지 않다 그 값을 가지고있는 임의의 변수). 적절한 API 함수 (대부분 HANDLE 인 경우, CLoseHandle)를 사용하여 직접 처리해야하며 예외적으로 "핸들 홀더"클래스를 사용하면 예외 안전합니다. 자원을 열 때

class AutoHandle 
{ 
    HANDLE handle; 
public: 
    AutoHandle(HANDLE in) : handle(in) {} 
    ~AutoHandle() { CloseHandle(handle); } 
}; 

그런 식으로, 당신은 AutoHandle 변수에 할당하고,이 범위를 벗어나면, 핸들 은 다음과 같습니다

이러한 핸들 홀더의 간단한 구현은 다음과 같을 수 있습니다 마감 된. 당신은 그것을하는 것을 잊을 수 없으며 예외가 발생할 경우에도 작동합니다.

1

당신이 말하는 HANDLE을 지정하지 않았으므로 Windows 핸들을 가정합니다.

은 은폐 데이터 형식 (대부분 OS가 사용할 수있는 숫자를 나타냄)이므로 CreateFile 또는 CloseHandle과 같은 시스템 기능으로 만 처리해야합니다.

관련 리소스를 잃어 버리면 HANDLE0으로 설정해서는 안됩니다.

CloseHandle, CreateFile (특히 반환 값) 및 Windows Data Types을 참조하십시오. 당신이 new 에드는 자신을 개체를 삭제해야하는 이유 Wikipedia

In computer programming, a handle is an abstract reference to a resource. Handles are used when application software references blocks of memory or objects managed by another system, such as a database or an operating system.

While a pointer literally contains the address of the item to which it refers, a handle is an abstraction of a reference which is managed externally; its opacity allows the referent to be relocated in memory by the system without invalidating the handle, which is impossible with pointers. The extra layer of indirection also increases the control the managing system has over operations performed on the referent. Typically the handle is an index or a pointer into a global array of tombstones.


그리고 C++ 표준에 의해 가비지 콜렉션이없는에서

,이 아니지만 핸들은 시스템에 의해 주어진!

0

일반적으로 NULL을 가리키는 포인터를 넣기 전에 delete를 사용하는 것을 선호합니다.

하지만 HANDLER의 경우 NULL로 설정하지 마십시오!

관련 문제