忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

delete前のNULLチェック

おはようございます。 かっちゃんです。

いやー、暑いですねー夏ですねー(=ω=;)
みなさん部屋の中での熱中症とか気を付けてくださいねー。
私はもう、文明の利器フル活用です。クーラーさん素敵!


今日はC++のdeleteのお話。

#define
SAFE_DELETE(p) { if (p){ delete p; } p = NULL; }


こんなマクロ使ってるのをよく見かけます。
私も以前使っていました。

拍手[0回]



pがNULLでなければdeleteする。
NULLチェックしてるから安全に削除出来ますよーというマクロだと思います。
 
マクロでなくても、
if (p != NULL)
{
    delete p;
    p = NULL;
}
 
このような感じで記述している人、多いと思います。

・・・が!
 
 
このNULLチェック、
 
 
本当は必要ありません。


C++の規格で

if the value of the operand of delete is the null pointer the operation has no effect.

つまり
「NULLをdeleteしても何も起こらない」
 
となっているのです。
 
 
そうです!(バチコーンッ
別にNULLチェックしなくても安全なんです!
 
 
誰だよ、こんな誤解広めたの・・・と少し経緯を調べてみましたが、
 
アプリケーションを作る上で、NULLポインタに触れると他の全スースが完璧であったとしても、一撃で即座にプログラムが終了してしまうことから、職業プログラマはNULLチェックを神経質に行う傾向にあり、その結果として、言語仕様の確認もせずdelete前にもNULLチェックを行う人が続出し、そのまま広まっていった。
 
という感じではないかと思います。あくまで軽く調べた上での推測ですが。
 
 
 
ということで、
delete前のNULLチェックは、if文の無駄遣いってことですw
 
 
ただ、山地さんがテストしてくれたのですが、
「NULLが入ったポインタの場合は、NULLチェックした方が速かった」
「逆の場合はNULLチェックしない方が若干速かった」
という結果が出たので、
 
NULLが入っている可能性が低くない場合はNULLチェックし、
NULLがまず入らない場合はNULLチェックしない。
 
とすると、多少は高速化になるかもしれません。
 
 
まぁ、面倒くさいですし、
deleteしたくて呼んでる=NULL入ってる方が少ない気がするので、
今までのマクロからチェック外すだけで良いんじゃないかと思います。

#define SAFE_DELETE(p) { delete p; p = NULL; }


C++ならテンプレートを使ってやる方が良いかもしれません。
template <class T>
inline void SafeDelete(T*& p)
{
  delete p;
  p = 0;
};


以上、知っている人は知っている、C++のdeleteの話でした。
ちなみにC言語のfree()関数も同様みたいですよー。

ではまたお会いしましょう!
PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

無題

  • by デフォルトの名無しさん
  • 2012/08/01(Wed)23:16
  • Edit
明示的 delete は SAFE_DELETE() も含めてすべて危険です。
delete なら auto_ptr などのスマートポインタに、
delete[] なら vector などの標準コンテナに、それぞれ置き換えてください。

SAFE_DELETE() は MSVC6 時代に Microsoft がサンプルコードを通じて広めた悪習です。

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]