Windowsにある種のNULLハンドルはありますか?経由でbmpを作成し、経由CreateCompatibleBitmap()
で削除しDeleteObject()
、移動セマンティクスを使用する場合は、ビットマップが破棄されないようにします。したがって、HBITMAP
を安全に削除できる値に設定する必要があります。のようにdelete nullptr
。
3 に答える
最初に悪いニュース。歴史的な理由から、WindowsAPIには一般的に有効な「無効なハンドル」値はありません。Windowsのさまざまなサブシステムは、NULL
またはINVALID_HANDLE_VALUE
無効なハンドル値と見なします(無効なハンドル値を返す場合と取得する場合の両方)。OldNewThingの関連記事。
ただし、幸いなことに、予期しない戻り値に備える必要がありますが(使用するすべての関数のドキュメントを調べない限り)、いずれかの無効な値を指定すると、実際には常に「機能」します。
指定された正しい「無効な」値を使用していない可能性がありますが、それでも無効であるため、関数は失敗します。アプリケーションがクラッシュすることはありません。CPUサイクルを数回無駄にする以外に悪影響はありません。
したがって、先に進んでNULL
(またはnullptr
)を使用してください。これで問題ありません。他に何もないとしても、後で誰かがあなたのコードを読むのは直感的です。具体的な例では、GDI関数が無効であると想定しているため、これも正しいことです。NULL
NULL
とは両方ともINVALID_HANDLE_VALUE
無効な値であるとほぼ信頼できます。HANDLE
有効なものはゼロ以外でなければならないという要件(ドキュメントに明示的に記載されているように)を私は知りませんが、実際には常にそうです。値がゼロのハンドルが見つからないことは間違いありません(Sysinternalsのhandle
ツールを試して使用してください。コンピューター上の単一のプロセスで、ハンドルが20未満になることはありません)。
ただし、それNULL
が有効なハンドル値である可能性があるとしても、main
呼び出される前やグローバルコンストラクターが実行される前でも、一部のハンドルは既に開いたり閉じたりしていることを考慮する必要があります。実際には選択の余地はありません。つまりNULL
、有効なハンドルである可能性があり、プログラムの実行時にまだ有効であると仮定すると、この架空のハンドルが偶然にAPI関数と互換性のあるタイプである可能性は非常に低くなります。
一方、アプリケーションでハンドルが開いていて、有効な値(unsigned) -1
がレンダリングされている可能性があると主張する人もいるかもしれません。INVALID_HANDLE_VALUE
あなたがハンドルを漏らしていない限り、私はあなたがこれほど多くの開いたハンドルをどうやって手に入れることができるか想像できません。しかし、もっと重要なことは、その数に達するずっと前に、64ビットシステムではメモリが不足し、32ビットシステムではアドレス空間が確実に不足することです。
有効なハンドルであることが問題になる場合INVALID_HANDLE_VALUE
は、はるかに深刻な問題があります。
そのような安全な価値はありません。有効なもの以外のものHGDIOBJ
、具体的には「論理ペン、ブラシ、フォント、ビットマップ、領域、またはパレットへのハンドル」を渡すDeleteObject
と、コントラクトが破られ、プログラムがクラッシュする可能性があります。または、特にOSのチェック済みビルドで、デバッガーに侵入する可能性があります。または、ハードディスクがログメッセージでいっぱいになる可能性があります。または、AppVerifierが失敗し、ロゴの認証ができなくなる可能性があります。または、プロセスの「appcompat」ルールをトリガーし、「下位互換性のために」新しいWindows機能を無効にすることもできます。しないでください。
プレースホルダーとして使用できますが、値をテストし、ハンドルが。の場合0
は呼び出さないでください。これは、前のテストがコードの無駄と見なされる、とは対照的です。DeleteObject
0
if (p) delete p;
通常、0は無効なハンドルであり、nullpointerに類似しています。
たとえば、CreateBitmap
失敗した場合は、無効なビットマップハンドルとして0を返します。
したがって、DeleteObject
nullhandleを使用して安全に呼び出すことができます。
指定されたハンドルが無効であるか、現在DCに選択されている場合、戻り値はゼロです。
これの例外は、によって返されるファイルハンドルです。CreateFile
ここで、INVALID_HANDLE_VALUE
はとして定義され-1
ます。