1

オブジェクトを値としてstd::map<std::string, HANDLE> SampleMap格納するがあります。HANDLEマップを使用した後、すべてのマップエントリをクリアしています。

SampleMap.clear();

そうすることで、ハンドルオブジェクトはどうなりますか。それらは削除されますか?

4

5 に答える 5

3

HANDLEは単なるtypedefであるか、ポインターへの定義です(AFAIK void*)。

マップをクリアするとき、それらは削除されません。あなたはそれらを自分で閉じる/解放する必要があります。

または、それを実行するラッパークラスを作成します。このスレッドを参照してくださいWindowsハンドルでC++標準のスマートポインタを使用するにはどうすればよいですか?いくつかの最初のアイデアのために。

于 2012-06-26T08:44:33.707 に答える
1

HANDLE一種のポインタであるため、それらを削除してもあまり効果はありません。これらHANDLEが指しているリソースを適切に解放するには、対応する関数(などCloseHandle)を明示的に呼び出す必要があります。

于 2012-06-26T08:44:16.747 に答える
1

それらは削除されず、ダングリングポインタ/ハンドルになります。

を自動削除する場合は、std :: unique_ptrを使用し、deleterオブジェクトをオーバーライドして、含まれているハンドルのタイプを削除します。

于 2012-06-26T08:45:37.980 に答える
0

ハンドルを閉じずにローカルオブジェクト参照を削除するのと同じ状況だと確信しています。CloseHandle毎回関数を使わなければならないのではないかと思います。ご存知かもしれませんが、OSはオブジェクトへの参照数を追跡し、ゼロに等しい場合にのみオブジェクトを削除します。オブジェクトがもう必要ないことをOSに通知する唯一の方法は、CloseHandle関数を使用することです。それ以外の場合、ハンドルはハンドルテーブルに残り、削除されません。

于 2012-06-26T08:44:07.990 に答える
0

そうすることで、ハンドルオブジェクトはどうなりますか

何もない。

それらは削除されますか?

いいえ。

于 2012-06-26T08:44:28.763 に答える