オブジェクトを値としてstd::map<std::string, HANDLE> SampleMap
格納するがあります。HANDLE
マップを使用した後、すべてのマップエントリをクリアしています。
SampleMap.clear();
そうすることで、ハンドルオブジェクトはどうなりますか。それらは削除されますか?
HANDLEは単なるtypedefであるか、ポインターへの定義です(AFAIK void*
)。
マップをクリアするとき、それらは削除されません。あなたはそれらを自分で閉じる/解放する必要があります。
または、それを実行するラッパークラスを作成します。このスレッドを参照してくださいWindowsハンドルでC++標準のスマートポインタを使用するにはどうすればよいですか?いくつかの最初のアイデアのために。
はHANDLE
一種のポインタであるため、それらを削除してもあまり効果はありません。これらHANDLE
が指しているリソースを適切に解放するには、対応する関数(などCloseHandle
)を明示的に呼び出す必要があります。
それらは削除されず、ダングリングポインタ/ハンドルになります。
を自動削除する場合は、std :: unique_ptrを使用し、deleterオブジェクトをオーバーライドして、含まれているハンドルのタイプを削除します。
ハンドルを閉じずにローカルオブジェクト参照を削除するのと同じ状況だと確信しています。CloseHandle
毎回関数を使わなければならないのではないかと思います。ご存知かもしれませんが、OSはオブジェクトへの参照数を追跡し、ゼロに等しい場合にのみオブジェクトを削除します。オブジェクトがもう必要ないことをOSに通知する唯一の方法は、CloseHandle
関数を使用することです。それ以外の場合、ハンドルはハンドルテーブルに残り、削除されません。
そうすることで、ハンドルオブジェクトはどうなりますか
何もない。
それらは削除されますか?
いいえ。