web-dev-qa-db-ja.com

C ++の「new」と「malloc」および「calloc」の違いは何ですか?

「new」と「malloc」、「calloc」と他の家族の違いは何ですか?

(いつ)「新しい」以外のものが必要ですか?

それらの1つは他を使用して実装されていますか?

51
Łukasz Lew

newおよびdeleteはC++固有の機能です。それらはCには存在しませんでした。mallocは古いCのやり方です。ほとんどの場合、C++で使用する必要はありません。

  • mallocは、初期化されていないメモリを割り当てます。割り当てられたメモリは、freeで解放する必要があります。
  • callocmallocに似ていますが、割り当てられたメモリを定数(0)で初期化します。 freeで解放する必要があります。
  • newは、コンストラクター(オブジェクトの場合)を呼び出して、割り当てられたメモリを初期化します。 newで割り当てられたメモリは、delete(デストラクタを呼び出す)で解放する必要があります。必要なサイズを手動で指定し、適切なタイプにキャストする必要はありません。したがって、より現代的でエラーが発生しにくくなります。
71
Mehrdad Afshari

new/delete + new []/delete []:

  • new/deleteは、メモリを割り当て、ヒープからメモリの割り当てを解除するC++の方法です。
  • new []およびdelete []は、連続したメモリの配列を割り当てるc ++の方法です。
  • Mallocよりも型安全であるため、使用する必要があります
  • コンストラクタ/デストラクタを呼び出すため、使用する必要があります
  • Reallocの方法で使用することはできませんが、新しい配置を使用して同じデータバッファを再使用できます
  • データをnewで割り当てたり、freeで解放したり、delete []することはできません。

malloc/free + family:

  • malloc/free/familyは、ヒープからメモリを割り当てたり解放したりするCの方法です。
  • callocはmallocと同じですが、メモリも初期化します
  • メモリの再割り当てが必要な場合に使用します
  • データはmallocで割り当てられず、deleteまたはdelete []で解放できません

私の ここに関連する答え も参照してください

20
Brian R. Bondy
  • newはctorを割り当てて呼び出し(順序は指定されていません)、dtorを削除し、newの呼び出しによって割り当てられたメモリを解放します
  • mallocは一部のメモリのみを割り当て、freeはmallocによって割り当てられたメモリを削除します
  • newはmallocを使用して実装できます(標準では必要ありません)
  • callocはmallocと同じことを行い、新しく割り当てられたメモリもゼロ化します

他の投稿が指摘しているように、malloc/freeはCと互換性があるC++の一部です。

次も参照してください: Stroustrup:new vs malloc

8
dirkgently

Newを使用すると、新しく割り当てられたメモリでコンストラクターが呼び出されます。割り当てられるものにコンストラクタがない場合、newはmallocと機能的に同じです。通常はそれを優先して使用する必要があります。

newはmallocの観点から実装される場合とされない場合があります。C++標準ではどちらのアプローチも必要ありません。

5
anon

新しいもの以外は必要ありません。 C++のmallocの完全な代替品です。

違いについては、Mallocはメモリを割り当てるだけです。新しい割り当てられたメモリとコンストラクターを呼び出します。同様に、freeはメモリを解放するだけです。 Deleteはメモリを解放し、デストラクタを呼び出します。

警告の言葉:2つのイディオムを混同しないでください。結果は未定義です。

5
Steve Rowe

newとmallocの主な違いは、reallocを使用してnewによって割り当てられたメモリを再割り当てできないことです。したがって、メモリブロックのサイズを増減したい場合は、新しいブロックを割り当ててすべてをコピーする必要がありました。

Callocを使用すると、mallocではなく、割り当てるメモリブロックを初期化できます。

1
z -

newオブジェクトの場合、オブジェクトのスペースが割り当てられるだけでなく、オブジェクトのコンストラクターが呼び出されます。しかし、これはC++の方法です。mallocは、メモリ割り当ての[〜#〜] c [〜#〜]の古いバージョンの方法です。 callocは、メモリをすべてのビットをゼロにクリアすることを除いて、mallocと同じです。

1
TStamper