DeleteObject

[戻る]
Zoom 2002/02/17(日) 14:07:00
DeleteObjectで、宣言しかしていないオブジェクトを
削除しても問題ないですか?
アプリケーションの使い方によって、そのオブジェクトを
作らない場合があるんです。

kokin 2002/02/17(日) 15:53:28
問題あるかないかは分かりませんが変数を0やNULLで初期化すれば問題ないかと
思います。

そうすればDeleteObjectのところで(変数をhogeとすると)
//ポインタならif(hoge != NULL)
if(hoge != 0){
  DeleteObject(hoge);
}

はずしてたらすいません。

Zoom 2002/02/17(日) 18:53:48
HPEN hPen = 0;
なら問題なしですか。

HPEN hPen;
だとどうでか?

if(hoge != 0)DeleteObject(hoge);
なら確実だけど、少しでも処理を減らしたいから
そこのところを詳しく教えてほしいです。

kazuma 2002/02/17(日) 19:31:03
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 を渡すのはやめておいたほうがいいと
思います。どんな値が入っているかわかりませんから。

kokin 2002/02/17(日) 20:40:22
>指定したハンドルが有効でない場合、またはデバイスコンテキストでそのオブジェクトが選択
>されている場合は、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 2002/02/17(日) 21:27:25
> kazumaさんが引用した物の日本語訳ですがこれを読む限りではどんな変な値を渡しても
> 0が返るだけで問題なさそうですが。

たまたま有効なハンドルになっているとまずいですよね。
削除するつもりの無いものを削除することになります。

kokin 2002/02/18(月) 08:54:58
それもそうですね。(^^;
出来るだけ処理を減らしたいって言うのも判りますが
チェックはした方が良いのでは?

Zoom 2002/02/18(月) 09:08:23
[[解決]]
ありがとうございます。
難しい話だから聞く一方でした。

教えていただいたことから、処理を最小限にするために
HPEN hPen = 0;
として、
DeleteObject(hPen);
とすることにしました。

HPEN hPen;
では削除するつもりの無いものを削除するばあいがあるんですね。
質問してよかったです。

kazuma 2002/02/18(月) 10:51:45
今更ですいませんが、そこまでして処理を減らす必要があるんでしょうか?

とおりすがり 2002/03/23(土) 14:43:22
今更ですいませんが、既に解決した質問に質問した理由を聞く必要があるんでしょうか?

古いスレッドには追加発言できません。