C++ の「new」と「malloc」および「calloc」の違いは何ですか?[重複]
-
03-07-2019 - |
質問
「new」と「malloc」、「calloc」およびその他のファミリーの違いは何ですか?
(いつ) 「新しい」以外に何か必要ですか?
そのうちの 1 つは他のものを使用して実装されていますか?
解決
new
および delete
はC ++固有の機能です。 Cには存在しませんでした。 malloc
は、古いCのやり方です。ほとんどの場合、C ++で使用する必要はありません。
-
malloc
は、初期化されていないメモリを割り当てます。割り当てられたメモリは、free
で解放する必要があります。 -
calloc
はmalloc
に似ていますが、割り当てられたメモリを定数(0)で初期化します。free
で解放する必要があります。 -
new
は、コンストラクター(オブジェクトの場合)を呼び出して、割り当てられたメモリを初期化します。new
で割り当てられたメモリは、delete
(デストラクタを呼び出す)で解放する必要があります。必要なサイズを手動で指定し、適切なタイプにキャストする必要はありません。したがって、より現代的でエラーが発生しにくくなります。
他のヒント
新しい/削除 + 新しい[]/削除[]:
- new/delete は、ヒープからメモリを割り当て、メモリの割り当てを解除する C++ の方法です。
- new[] と delete[] は、連続したメモリの配列を割り当てる C++ の方法です。
- malloc よりも型安全性が高いため、使用する必要があります。
- コンストラクター/デストラクターを呼び出すため、使用する必要があります。
- realloc 方法では使用できませんが、新しい配置を使用して同じデータ バッファを再利用できます。
- new でデータを割り当てたり、free でデータを解放したり、delete[] でデータを解放したりすることはできません。
malloc/free + ファミリー:
- malloc/free/family は、ヒープからメモリを割り当てたり解放したりする C の方法です。
- calloc は malloc と同じですが、メモリも初期化します
- メモリを再割り当てする必要がある場合に使用する必要があります。
- データを malloc で割り当てたり、delete または delete[] で解放したりすることはできません
私のものも見てください 関連する回答はこちら
- newはctorを割り当てて呼び出し(順序は指定されていません)、dtorを削除し、newの呼び出しによって割り当てられたメモリを解放します
- mallocは一部のメモリのみを割り当て、freeはmallocによって割り当てられたメモリを削除します
- newはmallocを使用して実装できます(標準では必要ありません)
- callocはmallocと同じことを行い、新しく割り当てられたメモリをゼロ化します
他の投稿が指摘しているように、malloc / freeはCと互換性があるC ++の一部です。
また参照: Stroustrup:new vs malloc
newを使用すると、新しく割り当てられたメモリでコンストラクターが呼び出されます。割り当てられるものにコンストラクタがない場合、newはmallocと機能的に同じです。通常はそれを優先して使用する必要があります。
newはmallocの観点から実装される場合とされない場合があります-C ++標準ではどちらのアプローチも必要ありません。
新しいもの以外は必要ありません。 C ++のmallocの完全な代替品です。
違いは、Mallocはメモリを割り当てるだけです。新しい割り当てられたメモリとコンストラクターを呼び出します。同様に、freeはメモリを解放するだけです。 Deleteはメモリを解放し、デストラクタを呼び出します。
警告:2つのイディオムを混同しないでください。結果は未定義です。
newとmallocの主な違いは、reallocを使用してnewによって割り当てられたメモリを再割り当てできないことです。したがって、メモリブロックのサイズを増減したい場合は、新しいブロックを割り当ててすべてをコピーする必要がありました。
Callocを使用すると、mallocが割り当てないメモリブロックを初期化できます。
オブジェクトを新規すると、オブジェクトのスペースが割り当てられるだけでなく、オブジェクトのコンストラクターが呼び出されます。しかし、これはC ++の方法です。 malloc は、メモリを割り当てる C の古いバージョンの方法です。 calloc は malloc と同じですが、メモリをすべてのビットをゼロにクリアする点が異なります。