との間には大きな違いが1つmalloc
ありnew
ます。malloc
メモリを割り当てます。Cではメモリの塊がオブジェクトであるため、これはCにとっては問題ありません。
C ++では、POD型(C型に似ています)を扱っていない場合は、実際にオブジェクトをそこに置くために、メモリ位置でコンストラクターを呼び出す必要があります。多くのC++機能がオブジェクトを自動的に非PODにするため、非PODタイプはC++では非常に一般的です。
new
メモリを割り当て、そのメモリ位置にオブジェクトを作成します。非PODタイプの場合、これはコンストラクターを呼び出すことを意味します。
あなたがこのようなことをするなら:
non_pod_type* p = (non_pod_type*) malloc(sizeof *p);
取得したポインタはオブジェクトを指していないため、逆参照できません。使用する前にコンストラクターを呼び出す必要があります(これはplacementを使用して行われますnew
)。
一方、次の場合:
non_pod_type* p = new non_pod_type();
new
オブジェクトが作成されたため、常に有効なポインタを取得します。
PODタイプの場合でも、2つの間に大きな違いがあります。
pod_type* p = (pod_type*) malloc(sizeof *p);
std::cout << p->foo;
によって作成されたPODオブジェクトは初期化されていないため、このコードは不特定の値を出力しmalloc
ます。
を使用new
すると、呼び出すコンストラクターを指定して、明確に定義された値を取得できます。
pod_type* p = new pod_type();
std::cout << p->foo; // prints 0
本当に必要な場合は、useを使用new
して初期化されていないPODオブジェクトを取得できます。詳細については、この他の回答を参照してください。
もう1つの違いは、障害時の動作です。メモリの割り当てに失敗すると、例外をスローしmalloc
ながらnullポインタを返します。new
前者は、使用する前に返されたすべてのポインターをテストする必要がありますが、後者は常に有効なポインターを生成します。
これらの理由から、C ++コードではnew
、ではなく、を使用する必要がありますmalloc
。ただし、それでも、new
後でリリースする必要のあるリソースを取得するため、「オープン」で使用しないでください。使用するときnew
は、その結果をすぐにリソース管理クラスに渡す必要があります。
std::unique_ptr<T> p = std::unique_ptr<T>(new T()); // this won't leak