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
無題
delete なら auto_ptr などのスマートポインタに、
delete[] なら vector などの標準コンテナに、それぞれ置き換えてください。
SAFE_DELETE() は MSVC6 時代に Microsoft がサンプルコードを通じて広めた悪習です。