최근 RAII에 대한 일반적인 질문이 SO에 게시되었습니다. 그러나 HANDLE 예제에는 여전히 구현 문제가 있습니다.사용자 정의 삭제자를 사용하여 shared_ptr을 사용하여 핸들 RAII 호환 가능
HANDLE
은 void *
에 windows.h
으로 입력됩니다. 따라서, 올바른 shared_ptr
정의는
std::tr1::shared_ptr<void> myHandle (INVALID_HANDLE_VALUE, CloseHandle);
예 1CreateToolhelp32Snapshot
을 할 필요가 : HANDLE
와 작품을 반환합니다.
const std::tr1::shared_ptr<void> h
(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);
나는 정의 (올바른 방법이 무엇인지?) 나는이 포인터를 명령 WINAPI 좀 더 전화를 할 때 문제가 계속에서 void
를 사용한다. 그들은 기능적으로 작동하지만 추악하며 더 나은 솔루션이 있어야합니다.
다음 예제에서 h
은 맨 위에 정의를 통해 생성 된 포인터입니다.
예 2OpenProcessToken
: 마지막 인수는 PHANDLE
입니다. 중형 캐스트와 함께. 3Process32First
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
(PHANDLE)&h);
예 : 첫 번째 인수는 HANDLE
이다. 정말 못 생겼어. 일정한 HANDLE
와
Process32First(*((PHANDLE)&h), &pEntry);
예 4 단순 비교. 정말 못 생겼어.
if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }
HANDLE에 적절한 shared_ptr을 만드는 올바른 방법은 무엇입니까?
첫 번째 예제 2 코드 스 니펫에서 안전한 'HANDLE'로 변환 한 후에 안전하지 않은 HANDLE을 삭제할 수 있습니까? – Etan
OpenProcessHandle()을 래핑하는 함수 (포스트에 추가)를 만들거나 shared_h가 INVALID_HANDLE_VALUE로 초기화 된 두 번째 코드 단편과 동일한 작업을 수행 할 수 있습니다. –