あれ?cocos2d-xのライブラリ内でNULLチェック後にdelete?

2014年3月4日

前に最底辺の私がこんなことを書いてしましましたが、
http://koheizidaigorou.blog.fc2.com/blog-entry-52.html
なんかcocos2d-xのコードを追っていたら、NULL判定をしてから、
deleteしている箇所がありましたよ。
CCPlatformMacros.h

...
#define CC_SAFE_DELETE(p)            do { if(p) { delete (p); (p) = 0; } } while(0)
#define CC_SAFE_DELETE_ARRAY(p)     do { if(p) { delete[] (p); (p) = 0; } } while(0)
#define CC_SAFE_FREE(p)                do { if(p) { free(p); (p) = 0; } } while(0)
#define CC_SAFE_RELEASE(p)            do { if(p) { (p)->release(); } } while(0)
#define CC_SAFE_RELEASE_NULL(p)        do { if(p) { (p)->release(); (p) = 0; } } while(0)
#define CC_SAFE_RETAIN(p)            do { if(p) { (p)->retain(); } } while(0)
...

俺もしかして間違っているかしら?
一部プラットフォームでは、C++規約を無視してdeleteにNULL値渡すとヤバイとかあるのか??
ああ、ちなみにこのdefineで記載されている do { … } while(0)が意味不明ですが、
これは、if文などを含む時のお作法です。
試しに以下のような処理動かそうとすると楽しいことが置きます。

#define TRANSLATE_COLOR(c)  if (c) { c=0x000000; } else { c=0xffffff }
...
if (isBlue)
    TRANSLATE_COLOR(color);
else
    TRANSLATE_COLOR(color);
...

まあ、if文に全部{}付けておけば大抵問題は起きないけどね。

c++

Posted by koheizi