私はCloseHandleを呼び出すことに関していくつか(もっと)質問があります。CloseHandleの混乱 - ハンドルの複数の "コピー"でCloseHandleを呼び出す必要がありますか?
したがって、the SO citizens have spoken, and you must always close a handle。
私はデストラクタで次のコードスニペットを書いた1
質問:
HANDLE handles[] = { m_hGrabberThread, m_hCtrlThread, m_hErrDispatchThread };
int nNumHandles = sizeof(handles)/sizeof(handles[0]);
for(int n = 0; n < nNumHandles; n ++)
CloseHandle(handles[n]);
は、上記のコード有効か、それとも私が個別に各ハンドルメンバ変数にはCloseHandle()を呼び出す必要があります?
私はこの質問を2に疑問を(漠然と)リンクされているとしif(m_hCtrlThread != INVALID_HANDLE_VALUE)
CloseHandle(m_hCtrlThread);
...
質問2
私はイベントハンドルを作成するクラスがあります。
HANDLE hEventAbortProgram = CreateEvent(NULL, TRUE, FALSE, NULL);
を
このハンドルは、他のオブジェクト内の他のスレッド間で共有されます。
は、ハンドルを共有することによって、私は意味:
while(WaitForSingleObject(m_hEventAbort, 0) == WAIT_TIMEOUT) {...}
イベントが通知され、すべてのスレッドが終了します:
objectB.m_hEventAbort = objectA.m_hEventAbort;
各オブジェクトのスレッドは、その後のようなものを行います。
私の質問は、ハンドルの各コピーでCloseHandleを呼び出すか、メインの「親」オブジェクトで1回だけ呼び出す必要がありますか?
私は頼んでいると思います - コピーされたときに参照カウントがカウントされますか?
私はハンドルがvoid *のtypedefであることを知っています。したがって、私の本能はいいえ、ハンドルごとに一度呼び出す必要があります。
「CloseHandle(INVALID_HANDLE_VALUE)」を呼び出すことが何らかの害を及ぼすのではないかと疑いがあります。 – ruslik
http://stackoverflow.com/questions/1562421/making-a-handle-raii-compliant-using-shared-ptr-with-a-custom-deleterをご覧ください。 Boostを使って簿記をすることができるかもしれません。 ) – MSalters