>>87 ISO の規格を見てちと補足。 new で確保したアドレス以外を渡すと delete および delete[] の動作は未定義。 なので何が起こるかわからない。まぁ大抵の場合は落ちると思う。 で、NULL を渡した場合は何も起こらないと規格で決まっているので if で判別する必要はない。 関数内とか auto として定義した場合は、int *i としたときの i の値は不定。 明示的に初期化すべき。;
> 3.2.2.3 - Macro NULL [diff.null] > -1- The macro NULL, defined in any of <clocale>, <cstddef>, > <cstdio>, <cstdlib>, <cstring>, <ctime>, or <cwchar>, > is an implementation-defined C++ null pointer constant > in this International Standard (lib.support.types). (NULLは"null pointer"を表す処理系依存の定数である)
>>113 5.2.10-5 注 64) Converting an integral constant expression (5.19) with value zero always yields a null pointer (4.10), but converting other expressions that happen to have value zero need not yield a null pointer.
>>155 void int signed unsigned long short float double char wchar_t bool auto register extern static const volatile typedef static_cast reinterpret_cast const_cast dynamic_cast new delete sizeof typeid enum union struct class inline template typename namespace using public protected private friend virtual this if else for while do switch break continue return goto try catch throw
class Base {}; class A : public Base {}; class B : public Base {}; class C : public Base {}; class D : public Base {};
Base* Hoge(int type,int arg1,int arg2){ switch (type){ case 0: return new A(arg1,arg2); case 1: return new B(arg1,arg2); case 2: return new C(arg1,arg2); case 3: return new D(arg1,arg2); default: return NULL; } }
テーブル化すると、 class Base {}; class A : public Base { public: A(int a, int b); }; class B : public Base { public: B(int a, int b); }; class C : public Base { public: C(int a, int b); }; class D : public Base { public: D(int a, int b); };