DeleteObjectで、宣言しかしていないオブジェクトを
削除しても問題ないですか?
アプリケーションの使い方によって、そのオブジェクトを
作らない場合があるんです。
問題あるかないかは分かりませんが変数を0やNULLで初期化すれば問題ないかと
思います。
そうすればDeleteObjectのところで(変数をhogeとすると)
//ポインタならif(hoge != NULL)
if(hoge != 0){
DeleteObject(hoge);
}
はずしてたらすいません。
HPEN hPen = 0;
なら問題なしですか。
HPEN hPen;
だとどうでか?
if(hoge != 0)DeleteObject(hoge);
なら確実だけど、少しでも処理を減らしたいから
そこのところを詳しく教えてほしいです。
MSDN で DeleteObject の説明を見ると、
> If the specified handle is not valid or is currently selected into a device
> context, the return value is zero.
となっているので DeleteObject に NULL を渡すのは問題なさそうですね。
ただ、初期化してないローカル変数の hPen を渡すのはやめておいたほうがいいと
思います。どんな値が入っているかわかりませんから。
>指定したハンドルが有効でない場合、またはデバイスコンテキストでそのオブジェクトが選択
>されている場合は、0 が返ります。
MSDN OnLine DeleteObject より
kazumaさんが引用した物の日本語訳ですがこれを読む限りではどんな変な値を渡しても
0が返るだけで問題なさそうですが。
実際100万回くらい無効な値をDeleteObjectに渡してみて削除してみましたが
特に問題なかったです。参考になればいいですが・・・
main()
{
inti;
for(i=0;i<1000000;i++)
{
func();
}
return 0;
}
void func(void)
{
HPEN hoge;
DeleteOject(hoge);
}
> kazumaさんが引用した物の日本語訳ですがこれを読む限りではどんな変な値を渡しても
> 0が返るだけで問題なさそうですが。
たまたま有効なハンドルになっているとまずいですよね。
削除するつもりの無いものを削除することになります。
それもそうですね。(^^;
出来るだけ処理を減らしたいって言うのも判りますが
チェックはした方が良いのでは?
ありがとうございます。
難しい話だから聞く一方でした。
教えていただいたことから、処理を最小限にするために
HPEN hPen = 0;
として、
DeleteObject(hPen);
とすることにしました。
HPEN hPen;
では削除するつもりの無いものを削除するばあいがあるんですね。
質問してよかったです。
今更ですいませんが、そこまでして処理を減らす必要があるんでしょうか?
今更ですいませんが、既に解決した質問に質問した理由を聞く必要があるんでしょうか?